有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
,所以我可以理解它吗?
答案 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