考慮以下兩段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解釋器將其標記爲已定義 –