如果我有:
2.times do i ||= 1 print "#{i} " i += 1 print "#{i} " end
我得到1 2 1 2,而我期待1 2 2 3.为什么我在循环开始时失去了它的赋值?如果赋值发生在循环之外,它的行为与预期的一样,所以我猜它与范围有关,但我没有意识到循环有自己的范围.有人可以澄清吗?
更新:感谢您的帮助.我的一部分困惑源于从Python进入Ruby,它没有块范围(我认为).
解决方法
看下面的代码:
2.times do p defined? i i ||= 1 p defined? i p "#{i} " i += 1 p "#{i} " end
输出:
nil "local-variable" "1 " "2 " nil "local-variable" "1 " "2 "
这意味着在每次迭代中都会创建一个新的范围,并且我只知道该范围;这是由nil和“局部变量”证明的.
现在我是在block之外创建的,看看输出(没有来):
i = nil 2.times do p defined? i i ||= 1 p defined? i p "#{i} " i += 1 p "#{i} " end
输出:
"local-variable" "local-variable" "1 " "2 " "local-variable" "local-variable" "2 " "3 "
要了解更多关于|| = look What Ruby’s ||= (Double Pipe / Or Equals) Really Does