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
吗?
答案 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