2011-05-08 45 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

相关问题