Enumerator#feed的神奇之处

时间:2013-05-22 13:15:23

标签: ruby

Enumerator#feed method这是偶然发现的。它被定义为:

  

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'

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

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

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

2 个答案:

答案 0 :(得分: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

如您所见,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"]

feed的工作方式:

  

首先您需要拨打电话,然后调用Feed来设置值,然后下一次调用next会应用更改(即使它引发了StopIteration error。)

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

答案 1 :(得分:1)

作为附录,来自current docs for Ruby v2.5

# Array#map passes the array's elements to "yield" and collects the
# results of "yield" as an array.
# Following example shows that "next" returns the passed elements and
# values passed to "feed" are collected as an array which can be
# obtained by StopIteration#result.
e = [1,2,3].map
p e.next           #=> 1
e.feed "a"
p e.next           #=> 2
e.feed "b"
p e.next           #=> 3
e.feed "c"
begin
  e.next
rescue StopIteration
  p $!.result      #=> ["a", "b", "c"]
end