Ruby 为什么';tλ重置初始值?

Ruby 为什么';tλ重置初始值?,ruby,lambda,local-variables,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?很明显,每次调用call时都不应该引用0。如果有,那么这样的

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

很明显,每次调用
call
时都不应该引用
0
。如果有,那么这样的
0
应该从何而来

我猜在创建lambda时,局部变量被设置并存储在lambda中。否则,如果您只是在上下文中突然引用lambda,则其局部变量的来源将不明显


因此,
start
绑定到lambda对象
rease
。由于您正在对同一对象调用
call
,因此
start
的值将保留。

很明显,每次调用
call
时,都不应该引用
0
。如果有,那么这样的
0
应该从何而来

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
我猜在创建lambda时,局部变量被设置并存储在lambda中。否则,如果您只是在上下文中突然引用lambda,则其局部变量的来源将不明显


因此,
start
绑定到lambda对象
rease
。由于您正在对同一对象调用
call
,因此
start
的值将保留。

start=0
不在lambda块内。当您调用
将\u增加(3)
时,它只被调用一次,而不是在调用lambda时。我们不是用.call调用整个函数吗?不仅仅是lambda?不。
call
调用
增加
,而不是
增加
“当我第二次调用此方法时,
为什么不启动
重置为
0
?”–是的,当您第二次调用
增加
时,局部变量
启动
将是
0
。但你没有。提示:您多久调用一次
增加\u
?您的代码中有多少对
增加\u的调用?
start=0
不在lambda块内。当您调用
将\u增加(3)
时,它只被调用一次,而不是在调用lambda时。我们不是用.call调用整个函数吗?不仅仅是lambda?不。
call
调用
增加
,而不是
增加
“当我第二次调用此方法时,
为什么不启动
重置为
0
?”–是的,当您第二次调用
增加
时,局部变量
启动
将是
0
。但你没有。提示:您多久调用一次
增加\u
?您的代码中有多少对
的调用增加了\u
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