Lambda行为

时间:2012-12-12 21:59:34

标签: ruby lambda

我很难理解是什么导致以下行为成为可能的(取自红宝石镐书):

def power_proc_generator
  value = 1
  lambda {value += value}
end

power_proc = power_proc_generator

3.times {puts power_proc.call} # => 2,4,8
3.times {puts power_proc_generator.call()} # => 2,2,2

我没有看到“power_proc”对象如何允许值继续加倍,因为我认为(错误地看来)每次调用都会将值重新赋值为1.

我的问题是为什么“3.times {puts power_proc.call}”结果为“2,4,8”而不是“2,2,2”?

2 个答案:

答案 0 :(得分:5)

power_proc_generator返回一个lambda,它使用(并修改)周围范围内变量的值。这称为闭包 - 返回的函数“关闭”value变量的值。因此,每次调用返回的函数时,它会将value乘以2。重要的是value在调用power_proc.call之间保持不变,因此您要修改现有变量。

另外,要详细说明打印power_proc_generatorpower_proc.call - power_proc_generator之间的区别,每次调用时都会返回一个新函数,这就是为什么你永远不会看到value增加。另一方面,power_proc.call继续多次调用相同的函数。

答案 1 :(得分:2)

power_proc_generator返回包含的lambda 包含变量'value'的闭包。所以变量挂起了 从一个power_proc.call到下一个。