2015-04-12 68 views

回答

2

正如你连接到提及,<<对于yielder对象上的yield方法的别名所以在环路中的第一行是等同于文档:

y.yield a 

这是调用next方法时Enumerator返回其下一个值的机制。

a, b = b, a + b是平行分配,分配的新值ab,但这种工作方式是,在右手边表达式的所有值计算第一,然后分配到上市的变量所以a的左边成为先前的b的值,并且b成为先前的a + b的值,如产生斐波纳契数列所需的那样。

Enumerator被要求提供下一个值时,会发生什么情况,该块将执行,直到达到yield,然后块停止执行,并将该值作为下一个值返回。然后当下一个数值被请求时,数据块从它离开的地方继续(因此在这个例子中它将计算新的ab),然后继续,直到它到达yield返回下一个值。

+0

我不认为“yielder”对象可以解释?为什么有这个对象?为什么不只是“屈服”? –

+2

@DanielStevens“yield”关键词例如在方法体内使用'yield a'来调用(yield control)作为方法调用的一部分提供的代码块,将任何参数作为参数传递给块。但这不是我们在这里需要的。如果我们有一个'Enumerator'并且想要使用'Enumerable'中的一个方法,让我们说'find',那么我们需要一种方法来传递一个块的值(Enumerator.new产生的值)的块)到另一个块(传递给'find'的块) - 这是yielder对象的用途。 – mikej