2011-05-08 41 views
0

我一直在試圖理解,如果你需要在Ruby中有一個閉包之前創建一個proc或lambda。難道Enumerable.Inject方法是閉包還是隻是一個塊?

作爲一個典型的例子,我們可以看看注入方法。它使用yield關鍵字,但它是一個閉包還是隻是一個塊?

def inject(init) 
    result = init 
    each do |item| 
    result = yield(result, item) 
    end 
    result 
end 

回答

2

一段代碼是閉合如果它捕獲封閉範圍,其中塊確實,所以塊(以及lambdas和進程)是封閉。

使用def定義的方法不過關閉任何東西,所以inject不是關閉。

+0

我聽說lamdda不一定是閉包。我會看看我能否找到對此的參考。所以注射不是封閉的,但它接受一個? – 2011-05-08 23:06:28

+0

@John:「我聽說拉姆達不一定是封閉。」無論誰告訴你這可能意味着block,lambda或proc不是閉包,如果它實際上並未使用封閉範圍中的任何變量。然而,應該指出的是,即使塊沒有使用封閉範圍中的任何變量,它仍然有對它們的引用,所以做出這樣的區分並不一定有意義。 「所以注射不是封閉,而是接受一個。」對,就是這樣。 – sepp2k 2011-05-08 23:13:52

相關問題