2012-04-11 57 views
4

某些未聲明的變量爲零,有些會拋出錯誤。怎麼來的?爲什麼未聲明的Ruby本地,實例,類和全局變量具有不同的行爲?

$ irb 
1.9.3p0 :001 > asdf # local 
NameError: undefined local variable or method `asdf' for main:Object 
from (irb):1 
from /Users/saizai/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>' 
1.9.3p0 :002 >@asdf # instance 
=> nil 
1.9.3p0 :003 >@@asdf # class 
NameError: uninitialized class variable @@asdf in Object 
from (irb):3 
from /Users/saizai/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>' 
1.9.3p0 :004 > $asdf # global 
=> nil 

回答

5

必須始終指定類變量,否則當您嘗試使用它們時將返回NameError。我目前沒有詳細說明這是爲什麼。

即使未分配實例和全局變量,也會返回nil。但是,如果您使用-w標誌運行腳本,它們會發出警告。

但是,我的確有關於局部變量的答案。局部變量像這樣行事的原因在於他們在他們面前沒有任何標點符號。這意味着該變量可以是變量或方法調用(因爲在不帶參數的方法調用後,Ruby不需要())。

something # could be a variable named 'something' or a method called 'something()' 

如果沒有分配給something變量值,則Ruby解釋假設它是一個方法調用。如果沒有這個名稱的方法,那麼它會提高NameError。這就是爲什麼你會得到這樣的信息:

NameError: undefined local variable or method 'something' for main:Object 
    from (irb):1 
    from path/to/Ruby/bin/irb:12 in '<main>' 

因此,它是重要的是,Ruby解釋器以這種方式,以防萬一它實際上是你指的是一種方法治療局部變量。

作爲一個有趣的邊注:

有一個怪癖 - 一個變量就開始存在時的Ruby解釋器 看到該變量賦值表達式。即使該分配未實際執行,也是這種情況。存在但尚未分配值的變量 的默認值爲 ,值爲零。

這意味着:

if false 
    z = "Something" 
end 

z.nil? #=> true 
never_assigned.nil? #=> NameError 

以上報價由大衛·弗拉納根和松本行弘節Ruby編程語言4.2

+1

在紅寶石的另一個有趣的現象是,如果你設置一個未定義的局部變量自己,它變成零。 'foo = foo#=> nil'我想知道這是否與您在示例中展示的類似,只是語法不同。 – 2012-06-19 12:12:46

+1

有趣。我認爲它完全一樣。解釋器看到賦值表達式,在它做任何事情之前,它可能會留出一些內存和默認值'nil'。然後它查看賦值的右側,並看到一個在ms前設置爲「nil」的變量,並賦予該值「foo」。所以,我猜在'foo = foo'中,變量被賦予了兩次'nil':一次當它出現時,再一次解釋右側。我愛Ruby的怪癖! =) – 2012-06-19 20:04:04

相關問題