1
我正在浏览Enumerator
类的文档,发现一个让我困惑的斐波那契实现。这里的代码:将“yielder”对象传递给Ruby的枚举器
fib = Enumerator.new do |y|
a = b = 1
loop do
y << a
a, b = b, a + b
end
end
p fib.take(10) #=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
这是怎么回事?循环块中的两条线特别让我困惑。
链接:http://ruby-doc.org/core-2.1.5/Enumerator.html#method-c-new
我不认为“yielder”对象可以解释?为什么有这个对象?为什么不只是“屈服”? –
@DanielStevens“yield”关键词例如在方法体内使用'yield a'来调用(yield control)作为方法调用的一部分提供的代码块,将任何参数作为参数传递给块。但这不是我们在这里需要的。如果我们有一个'Enumerator'并且想要使用'Enumerable'中的一个方法,让我们说'find',那么我们需要一种方法来传递一个块的值(Enumerator.new产生的值)的块)到另一个块(传递给'find'的块) - 这是yielder对象的用途。 – mikej