13

このEnumerator#feed メソッドがあり、偶然発見しました。次のように定義されています。

feed obj → nil
次のyieldで返される値をe内に設定します。値が設定されていない場合、yield は nil を返します。この値は譲られた後にクリアされます。

私は例を調べて、「やった!」と考えましたfeed

enum = ['cat', 'bird', 'goat'].each # creates an enumerator
enum.next #=> 'cat'
enum.feed 'dog'
enum.next #=> returns 'bird', but I expected 'dog'

しかし、うまくいきません。内部で使用していない'dog'ため、を返さないと思います。eachyield

問題は、ドキュメントの例から実際のユースケースを推測できなかったことです.Googleはこの質問の友達ではなく、(私が試したことから)feed他のEnumerator/Enumerationメソッド。

を説明する良い例を教えてください。そうすれば、理解できますfeedか?

4

2 に答える 2

6
def meth
 [1,2,3].each {|e| p yield(e)}
end

m = to_enum(:meth)
m.next #=> 1

m.feed "e"

m.next
#printed: "e"
#return => 2

ご覧のとおり、フィードはyieldの結果に影響しますが、列挙子メソッドはそれに注意する必要があります

あなた自身の例を見てください:

a = ['cat', 'bird', 'goat']
m = a.to_enum(:map!)
m.next
m.feed("dog")
m.next
m.next
p a #=> ["dog", nil, "goat"]

方法feedは次のとおりです。

最初に next を呼び出す必要があり、次に feed を呼び出して値を設定し、次の next の呼び出しで変更が適用されます (たとえStopIteration error. が発生したとしても)。

詳細については、次のスレッドを参照してくださいEnum#feed:。これには、についての適切な説明がありenum#feedます。

于 2013-05-22T13:49:29.883 に答える