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

Ruby Enumerable Moduleの基本ガイド(+私のお気に入りの方法)

列挙可能とは何ですか?

列挙可能は反復法のコレクションです 、Rubyモジュール、そしてRubyを優れたプログラミング言語にする大きな部分です。

列挙可能には次のような便利なメソッドが含まれます

  • マップ
  • 選択
  • 注入

列挙可能なメソッドは、ブロックを与えることで機能します。

そのブロックで、すべての要素で何をしたいのかを伝えます。

[1,2,3].map { |n| n * 2 }

すべての数値が2倍になった新しい配列を提供します。

正確に何が起こるかは、使用する方法、 mapによって異なります。 すべての値を変換するのに役立ちます、 select リストをフィルタリングしてinjectすることができます 配列内のすべての値を合計するために使用できます。

20を超えるRubyEnumerableメソッドがあります。

1つ詳しく調べてみましょう。

Each_Consメソッド

私の新しいお気に入りの列挙可能 メソッドはeach_consです !

理由は次のとおりです

このメソッドは非常に便利です。これを使用して、nグラムを検索したり、 all?と組み合わせたときに一連の数字が連続しているかどうかを確認したりできます。 、別の列挙可能 メソッド。

Ruby Enumerable Moduleの基本ガイド(+私のお気に入りの方法)

each_cons サイズnのサブ配列を提供します 、したがって、 [1,2,3]がある場合 、次に each_cons(2) [[1,2]、[2,3]]が表示されます 。

例を見てみましょう

numbers = [3,5,4,2]

numbers.sort.each_cons(2).all? { |x,y| x == y - 1 }

このコードは、番号を並べ替えてから、 each_cons(2)を呼び出すことから始まります。 、 Enumeratorを返します オブジェクト、そしてそれは all?を呼び出します すべての要素が条件に一致するかどうかを確認するメソッド。

each_consを使用する別の例を次に示します。 次のように、文字が同じ文字で囲まれているかどうかを確認するには: xyx

str = 'abcxyx'

str.chars.each_cons(3).any? { |a,b,c| a == c }

もっとあります!

true を取得する代わりに、このパターンが何回発生するかを知りたい場合 / false 結果として、 any?を変更するだけです。 countへ 。

私がさらに魅力的だと思うのは、 each_consの実装です。 メソッド。

array = []

each do |element|
  array << element
  array.shift     if array.size > n
  yield array.dup if array.size == n
end

:これは、 EnumerableのRubinius実装に由来します 。元のソースコードはここにあります。

実装は空のRuby配列から始まり、 eachを使用して要素を反復処理します。 。

ここまではすべてがかなり標準的です。ただし、その後、要素を配列に追加し、サイズが必要なサイズよりも大きい場合は(Array#shiftを使用して)配列をトリミングします。

サイズはeach_consへの引数です 。

次に、 dupを生成します アレイが要求されたサイズの場合は、アレイのサイズ。

これは天才だと思います。配列インデックスをいじくり回す代わりに、列挙可能なオブジェクトに「スライディングウィンドウ」のような効果を維持するからです。

より魅力的な方法

メソッド 説明
カウント 名前のとおり、ブロック内で真と評価されるものを数えます
group_by ブロックの戻り値で列挙可能な要素をグループ化します。ハッシュを返します
パーティション 2つのグループに分割します。 2次元配列を返します
何か? trueを返します ブロックがtrueを返す場合 それに生成されたすべての要素について
すべて? trueを返します ブロックがtrueを返す場合 それに与えられたすべての要素について
なし? all?の反対
cycle(n) すべての要素をn回繰り返すので、 [1,2] .cycle(2)を実行すると [1,2,1,2]があります
検索 selectのように 、ただし、最初に見つかったものを返します
注入 前のブロック値の結果を累積し、次のブロック値に渡します。合計を合計するのに便利です
zip 2つの列挙可能なオブジェクトを接着して、それらを並行して操作できるようにします。要素の比較とハッシュの生成に役立ちます
マップ 列挙可能なオブジェクトのすべての要素を変換し、新しいバージョンを配列として返します

まとめ

ご覧のとおり、列挙可能 は習得する価値のあるモジュールなので、ドキュメントにアクセスして、何ができるかを確認してください。

この記事を楽しんだら、下のフォームで私のニュースレターを共有して購読することを忘れないでください。それは私に大いに役立つでしょう! 🙂


  1. Ruby Mapメソッドの使用方法(例付き)

    Mapは、配列、ハッシュ、範囲で使用できるRubyメソッドです。 マップの主な用途は、データを変換することです。 例 : 文字列の配列が与えられた場合、すべての文字列に目を通し、すべての文字を大文字にすることができます。 または、Userのリストがある場合 オブジェクト… 変換できます 対応するメールアドレス、電話番号、またはその他の属性のリストにそれらを追加します Userで定義 クラス。 これを行う方法を正確に見てみましょう! ルビーマップ構文 マップの構文は次のようになります: array = [a, b, c] array.map { |string| string.

  2. Ruby開発者のための時間計算量への決定的なガイド

    時間計算量は、コンピュータサイエンスから学ぶことができる最も興味深い概念のひとつであり、それを理解するのに学位は必要ありません! 特定のアルゴリズムやプログラムが遅い理由を確認するのに役立つので興味深いです &それをより速くするためにあなたは何ができますか。 これを独自のコードに適用できます。 これはすべての派手なアルゴリズムを超えて これは、この記事の後半で説明するように、コンピュータサイエンスの本にあります。 しかし、最初に、何が遅いのか、何が速いのかについて話す必要があります。 遅いvs速い 150ミリ秒(ミリ秒)で100万個の数値を並べ替えるのは遅いですか、それとも速いですか