Ruby配列の多くのメソッドは、パラメーターまたはブロック( index
、、、など)なしで呼び出されると、列挙子を返します。keep_if
each
drop_while
- ブロックでメソッドを呼び出すのではなく、この形式のメソッドを使用するのが適切なのはいつですか。
Ruby配列の多くのメソッドは、パラメーターまたはブロック( index
、、、など)なしで呼び出されると、列挙子を返します。keep_if
each
drop_while
ドキュメントからEnumerator
:
ほとんどのメソッドには2つの形式があります。列挙内の各項目についてコンテンツが評価されるブロック形式と、反復をラップする新しい列挙子を返す非ブロック形式です。
これにより、列挙子をチェーン化できます。たとえば、次の方法で、リストの要素をインデックスと要素を文字列として含む文字列にマップできます。
puts %w[foo bar baz].map.with_index {|w,i| "#{i}:#{w}" } # => ["0:foo", "1:bar", "2:baz"]
列挙子は、外部イテレータとしても使用できます。たとえば、Enumerator#nextはイテレータの次の値を返すか、列挙子が最後にある場合はStopIterationを上げます。
e = [1,2,3].each # returns an enumerator object. puts e.next # => 1 puts e.next # => 2 puts e.next # => 3 puts e.next # raises StopIteration
コピー&ペーストで申し訳ありませんが、これ以上の説明はできませんでした。
Enumeratorクラスが存在する主な元々の理由は、メソッドの連鎖です。
array.each.with_object [[], []] { |element, memo| ... }
つまり、基本的には、それについて心配する必要はありません。