2015-04-12 66 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