我很难理解是什么导致以下行为成为可能的(取自红宝石镐书):
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”?
答案 0 :(得分:5)
power_proc_generator
返回一个lambda,它使用(并修改)周围范围内变量的值。这称为闭包 - 返回的函数“关闭”value
变量的值。因此,每次调用返回的函数时,它会将value
乘以2。重要的是value
在调用power_proc.call
之间保持不变,因此您要修改现有变量。
另外,要详细说明打印power_proc_generator
和power_proc.call
- power_proc_generator
之间的区别,每次调用时都会返回一个新函数,这就是为什么你永远不会看到value
增加。另一方面,power_proc.call
继续多次调用相同的函数。
答案 1 :(得分:2)
power_proc_generator返回包含的lambda 包含变量'value'的闭包。所以变量挂起了 从一个power_proc.call到下一个。