Enumerator#feed的神奇之处

tes*_*ssi 14 ruby

有这种Enumerator#feed方法,我偶然发现了.它被定义为:

feed obj→nil
设置e中下一个yield返回的值.如果未设置该值,则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'
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我假设它没有返回'dog',因为each它不是在yield内部使用.

问题是,我无法从文档中的给定示例中推断出任何真实世界的用例,Google不是这个问题的朋友,并且(从我尝试过的)feed似乎不适合其他Enumerator/ Enumeration方法.

请你能给我一个很好的例子来解释一下feed,所以我能绕过它吗?

Aru*_*hit 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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,feed会影响yield的结果,但是枚举器方法需要注意它

现在看看你自己的例子:

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

方式feed有效:

首先你需要调用next然后调用feed来设置值,然后next的下一次调用会应用更改(即使它引发了一个StopIteration error.)

有关更多解释,请查看此处的主题:Enum#feed:.这有正确的解释enum#feed.