Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

RubyEnumerablesのスライスとダイシング

今日はslice_beforeについてお話します 、slice_when およびslice_after 。これらは、任意の基準に基づいて配列またはその他の列挙可能なアイテムをグループ化する必要がある場合に非常に便利な方法です。

あなたはおそらくArray#sliceに精通しているでしょう 。インデックスの範囲に基づいて配列のサブセットを引き出すことができます:

a = ["a", "b", "c"]
a.slice(1, 2)
# => ["b", "c"]

これは便利ですが、列挙型にはインデックスがないため、列挙型では使用できません。

slice_beforeslice_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_whenslice_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 と他のすべてのお気に入りの列挙可能なメソッド。一体、あなたは別の分割をすることさえできます。 :)


  1. RuboCopを使用したRubyコードのリンティングと自動フォーマット

    リンティングは、プログラムおよびスタイルのエラーについてソースコードを自動チェックすることです。このチェックは、リンターと呼ばれる静的コード分析ツールによって実行されます。ただし、コードフォーマッタは、事前に構成された一連のルールに厳密に準拠するようにソースコードをフォーマットするためのツールです。リンターは通常違反を報告しますが、問題を修正するのは通常プログラマー次第ですが、コードフォーマッターはそのルールをソースコードに直接適用する傾向があるため、フォーマットの間違いを自動的に修正します。 プロジェクトでより一貫性のあるコードスタイルを作成するタスクでは、通常、個別のリンティングツールと

  2. LoggerとLogrageを使用してRubyにログインする

    Rubyでのログの操作 ロギングは、アプリケーションが通常対処する主要なタスクの1つです。ログは、たとえば、必要なときに使用されます アプリ内で何が起こっているかを確認します それらを監視する、または 特定のデータの指標を収集します。 新しいプログラミング言語を学ぶとき、情報を記録するための最初の明白な選択は、ネイティブメカニズムです。通常、それは簡単で、文書化されており、コミュニティ全体に広く行き渡っています。 ログデータは、使用している会社、ビジネス、アプリケーションの種類によって大きく異なります。したがって、あなたとあなたのチームが選択したロギングソリューションがその全体的な使