6

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

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" ?

4

2 回答 2

5

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

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

于 2012-12-12T22:14:21.620 回答
2

power_proc_generator 返回一个 lambda,其中包含一个包含变量“value”的闭包。因此,该变量从一个 power_proc.call 到下一个。

于 2012-12-12T22:22:31.527 回答