RubyEnumerablesのスライスとダイシング
今日はslice_before
についてお話します 、slice_when
およびslice_after
。これらは、任意の基準に基づいて配列またはその他の列挙可能なアイテムをグループ化する必要がある場合に非常に便利な方法です。
あなたはおそらくArray#slice
に精通しているでしょう 。インデックスの範囲に基づいて配列のサブセットを引き出すことができます:
a = ["a", "b", "c"]
a.slice(1, 2)
# => ["b", "c"]
これは便利ですが、列挙型にはインデックスがないため、列挙型では使用できません。
slice_before
、slice_when
およびslice_after
メソッドはインデックスに依存しないため、任意の列挙可能なメソッドで使用できます。見てみましょう!
Enumerable#slice_before
の使用
Enumerable#slice_before
一致する前の時点で分割され、グループに列挙可能です。
一致は===
を介して行われます 演算子。これは、あらゆる種類のものに一致できることを意味します。
単一の値に一致させることができます。それは明らかなはずです。 :)
a = ["a", "b", "c"]
a.slice_before("b").to_a
# => [["a"], ["b", "c"]]
より複雑なテキストマッチングには正規表現を使用できます。
a = ["000", "b", "999"]
a.slice_before(/[a-z]/).to_a
# => [["000"], ["b", "999"]]
数値を使用している場合は、範囲に基づいて配列をスライスできます。
a = [100, 200, 300]
a.slice_before(150..250).to_a
# => [[100], [200, 300]]
これは少し奇妙に思えるかもしれませんが、===
の動作と完全に一致しています。 オペレーター。
a = [1, "200", 1.3]
a.slice_before(String).to_a
# => [[1], ["200", 1.3]]
他のオプションのどれも十分な柔軟性がない場合は、いつでもプログラムでブロックと一致するものを見つけることができます。
a = [1, 2, 3, 4, 5]
a.slice_before do |item|
item % 2 == 0
end
# => [[1], [2, 3], [4, 5]]
Enumerable#slice_after
の使用
Enumerable#slice_after
Enumerable#slice_before
とまったく同じように機能します スライスが試合後に発生することを除いて。図に行きます。 :-)
a = ["a", "b", "c"]
a.slice_after("b").to_a
# => [["a", "b"], ["c"]]
もちろん、正規表現、範囲、およびブロックを使用して一致させることができます。面倒なので、ここではそれらの例を示しません。
Enumerable#slice_when
の使用
Enumerable#slice_when
はslice_before
とは別の獣です およびslice_after
。配列内の単一のアイテムを照合する代わりに、隣接するアイテムのペアを照合します。
これは、アイテム間の「エッジ」に基づいてアイテムをグループ化できることを意味します。
たとえば、ここでは、隣接するアイテムへの「近さ」に基づいてアイテムをグループ化します。
a = [1, 2, 3, 100, 101, 102]
# Create a new group when the difference
# between two adjacent items is > 10.
a.slice_when do |x, y|
(y - x) > 10
end
# => [[1, 2, 3], [100, 101, 102]]
詳細については、RubyDocsでslice_when
を確認してください。 。彼らはいくつかの素晴らしいコード例を持っています。
配列は理解しやすいので、上記の例のほとんどで配列を使用しました。 slice_before
を使用できることを覚えておく必要があります 、slice_when
およびslice_after
列挙可能なもので。
たとえば、多数のメールを含むファイルがある場合、slice_before
を使用して個々のメールを分割できます。 。以下のコードはドキュメントから抜粋したものです。
open("mbox") { |f|
f.slice_before { |line|
line.start_with? "From "
}.each { |mail|
puts mail
}
また、sliceメソッドは配列を返さないことに注意してください。それらは列挙可能なものを返します。つまり、map
を使用できます 、each
と他のすべてのお気に入りの列挙可能なメソッド。一体、あなたは別の分割をすることさえできます。 :)
-
RuboCopを使用したRubyコードのリンティングと自動フォーマット
リンティングは、プログラムおよびスタイルのエラーについてソースコードを自動チェックすることです。このチェックは、リンターと呼ばれる静的コード分析ツールによって実行されます。ただし、コードフォーマッタは、事前に構成された一連のルールに厳密に準拠するようにソースコードをフォーマットするためのツールです。リンターは通常違反を報告しますが、問題を修正するのは通常プログラマー次第ですが、コードフォーマッターはそのルールをソースコードに直接適用する傾向があるため、フォーマットの間違いを自動的に修正します。 プロジェクトでより一貫性のあるコードスタイルを作成するタスクでは、通常、個別のリンティングツールと
-
LoggerとLogrageを使用してRubyにログインする
Rubyでのログの操作 ロギングは、アプリケーションが通常対処する主要なタスクの1つです。ログは、たとえば、必要なときに使用されます アプリ内で何が起こっているかを確認します それらを監視する、または 特定のデータの指標を収集します。 新しいプログラミング言語を学ぶとき、情報を記録するための最初の明白な選択は、ネイティブメカニズムです。通常、それは簡単で、文書化されており、コミュニティ全体に広く行き渡っています。 ログデータは、使用している会社、ビジネス、アプリケーションの種類によって大きく異なります。したがって、あなたとあなたのチームが選択したロギングソリューションがその全体的な使