我很难理解是什么使得以下行为成为可能(取自红宝石镐书):
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
Run Code Online (Sandbox Code Playgroud)
我没有看到"power_proc"对象如何允许值继续加倍,因为我认为(错误的看起来)每次调用都会将值重新赋值为1.
我的问题是为什么"3.times {puts power_proc.call}"结果为"2,4,8"而不是"2,2,2"?
power_proc_generator返回一个lambda,它使用(并修改)周围范围中变量的值.这称为闭包 - 返回的函数"关闭" value变量的值.因此,每次调用返回的函数时,它都会乘以value2.重要的部分是value在调用之间保持不变power_proc.call,因此您要修改现有变量.
此外,详细说明打印power_proc_generator和power_proc.call- power_proc_generator每次调用时返回一个新功能的区别,这就是为什么你永远不会看到value增加.power_proc.call另一方面,继续多次调用相同的函数.