为什么lambda不能重置初始值?

时间:2017-11-10 05:18:01

标签: ruby lambda local-variables

sitepoint上的ruby教程有:

def increase_by(i)
  start = 0
  lambda { start += i }
end

increase = increase_by(3)
increase.call # => 3
increase.call # => 6

当我第二次调用此方法时,为什么start没有重置为0?考虑到函数开头有3,不应该调用这两个函数返回start = 0吗?

2 个答案:

答案 0 :(得分:1)

很明显,每次在0上调用call时都不应该引用increase。如果确实如此,0来自哪里?

我想局部变量已设置并在创建lambda时存储在lambda中。否则,如果您只是在上下文中引用了lambda,那么它的局部变量来自哪里就不明显了。

因此,start绑定到lambda对象increase。由于您在同一个对象上调用call,因此会保留start的值。

答案 1 :(得分:1)

increase = increase_by(3) # Sets start to 0 then returns the lambda which whill now increment start by 3 on each call
increase.call # => 3 # Calls the lambda which adds 3 to start then returns it
increase.call # => 6 # Same as above