[英]I don't understand ruby local scope
在這個例子中
def foo(x)
if(x > 5)
bar = 100
end
puts bar
end
然后foo(6)輸出:100和foo(3)什么都不輸出。
但是,如果我將定義更改為
def foo(x)
if(x > 5)
bar = 100
end
puts bob
end
我收到“未定義的局部變量或方法”錯誤。
所以我的問題是,為什么我在調用foo(3)並沒有設置bar時沒有收到此錯誤?
這里發生了幾件事。 首先,在if
塊內聲明的變量與在方法頂層聲明的變量具有相同的局部范圍,這就是為什么bar
在if
之外可用的原因。 其次,由於bob
被直接引用而突然遇到錯誤。 Ruby解釋器從未見過它,也從未見過它初始化過。 但是,它之前在if語句中看到bar
初始化。 因此,當被禁止時,它知道它的存在。 結合這兩個,這就是您的答案。
您的第二個示例實際上是一條紅鯡魚:之所以得到異常,並不是因為bob
未初始化,而是因為它是模棱兩可的。 不可能確定它是變量還是方法。
您的第一個示例有效,因為未初始化的局部變量(以及全局變量和實例變量)求值為nil
。 因此, puts bar
非常好:在一種情況下, bar
初始化為100
,其值為100
,在另一種情況下, bar
未初始化,因此值為nil
。 puts
調用to_s
放在其參數(為nil
定義)上(它只是返回空字符串),因此一切都很好。
另請參見在Ruby中,為什么在啟動irb后,foo.nil? 說未定義的錯誤,@ foo.nil? 給出“ true”,@@ wah.nil? 再次給出錯誤?
因此,請勿將其視為福音(因為它更多的是基於觀察然后理解),但是紅寶石解釋器似乎會將等號左側的任何單詞(前面沒有豎線)標記為本地。 您的例子很奇怪,這更奇怪
def foo
bar = bar
puts bar // nil, which gets coerced into ""
end
我不知道它為什么或如何工作,但是在那里。
foo(3)
不輸出任何內容。 它輸出一個換行符。
使用inspect
可以給您更多提示:
def foo(x)
if(x > 5)
bar = 100
end
puts bar.inspect
end
foo(3)
打印出來
nil
bar
是一個完整的變量,恰好具有值nil
。
我不確定你在問什么。 由於從未定義bob
,因此使用第二個定義運行foo(3)
始終會給出錯誤。 該方法的參數不會改變它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.