考虑以下两段ruby代码片段。Ruby中的变量范围
puts "One"
if false
d = 1
end
puts "Two"
puts d
puts "Three"
这将打印以下
One
Two
Three
现在,请考虑以下
[].each do |i|
flag = false
end
puts "Two"
puts flag
puts "Three"
这给出了以下
Two
'<main>': undefined local variable or method 'flag' for main:Object (NameError)
为什么在第一种情况下空白打印和第二ca是否引发错误?
感谢
的[我不明白红宝石局部范围]可能的复制(http://stackoverflow.com/questions/4154864/ i-dont-understand-ruby-local-scope) –
块创建一个新的作用域,因此在该作用域之外的变量未被定义。 '如果'另一方面 - 不。当解释器看到一行代码将赋予一个变量值时,它会确保它首先被定义并用'nil'初始化它。这也是为什么'foo = bar'会给你一个错误,而'baz = baz'不会。 – ndn
在第二种情况下,'flag'变量是该块的范围,因此在外面不可见(http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/localvars.html)。在第一种情况下,即使代码块没有执行,该变量也会被定义 - 这一部分我不确定 - 可能是Ruby解释器将其标记为已定义 –