5

次のような単純な列挙子を考えてみましょう。

natural_numbers = Enumerator.new do |yielder|
  number = 1
  loop do
    yielder.yield number
    number += 1
  end
end

私の質問は、なぜルビーはyielderオブジェクトでyieldを呼び出す必要があるのですか? 別の言い方をすれば: に置き換えられないのはなぜyielder.yield numberですかyield number? この例では、許可されていれば同じものに見えます。自明ではない方法でyielderが使用されている例はありますか? もしそうなら、あなたはそれを与えることができますか?そうでない場合、yielder の目的は何ですか?

ありがとう。

4

1 に答える 1

3

それが理由であるかどうかは100%わかりませんが、yield(常に)次を呼び出すメソッドに送信されたブロックに単独で適用さyieldれます。あなたの場合、natural_numbers割り当てを含むメソッド。そして、それが望まれることを実行することEnumerator、すなわち、列挙子要素を放出することは不可能です。同じ名前ですYielder#yieldが、はメソッドであり、Rubyyieldはステートメントです。

つまり、ステートメントEnumeratorで機能するコンストラクターを実装することはできません。yield

于 2011-12-27T09:37:30.063 に答える