Ruby 为什么';tλ重置初始值?
sitepoint上的ruby教程包含以下内容: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。如果有,那么这样的
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