2011-12-27 69 views
5

考慮一個簡單枚舉是這樣的:爲什麼Enumerator.new需要一個「yielder」對象?

natural_numbers = Enumerator.new do |yielder| 
    number = 1 
    loop do 
    yielder.yield number 
    number += 1 
    end 
end 

我的問題是:爲什麼紅寶石要求我們的yielder對象調用的收益呢?換句話說:爲什麼我們不能用yield number代替yielder.yield number?在這個例子中,如果允許的話,它看起來是同樣的東西。有沒有例子說明yielder是以不平凡的方式使用的?如果是這樣,你可以給一個嗎?如果不是,Yielder的目的是什麼?

謝謝。

回答

3

不是100%肯定是否這是原因,但yield單獨(總是)適用於提交給調用yield的方法的塊:在您的情況下,包含natural_numbers賦值的方法;並且它不可能執行Enumerator所需的內容,即發出Enumerator元素。儘管同名,Yielder#yield是一種方法,Ruby的yield是一個聲明。

換句話說,將不可能實現Enumerator構造函數,它將與yield語句一起使用。

相關問題