2013-03-03 62 views
0

我正在玩class塊中的本地,類變量和實例變量創建,如下所示。但是我發現了一些我未能解釋自己的事情。我的困惑已經發布在下面的兩個代碼之間。與類和實例變量創建混淆

class Foo 
def self.show 
@@X = 10 if true 
p "hi",@@X.object_id,x.object_id 
end 
end 
#=> nil 
Foo.show 
#NameError: undefined local variable or method `x' for Foo:Class 
# from (irb):4:in `show' 
# from (irb):7 
# from C:/Ruby193/bin/irb:12:in `<main>' 

以上是預期的錯誤。但在下面的代碼中,我已將類變量@@X指定爲10。但是在p聲明中,我使用了實例變量@X。爲什麼錯誤不像上面的代碼那樣?

class Foo 
def self.show 
@@X = 10 if true 
p "hi",@X.object_id 
end 
end 
#=> nil 
Foo.show 
"hi" 
4 
#=> ["hi", 4] 

回答

2

因爲everything is object並沒有明確的變量聲明的要求在Ruby中,你的代碼

p @X.object_id 

悄悄引入了一個實例變量@X@X.nil? == true)。你可以看到這個神奇irb

~ irb 
> p @x.object_id 
# 8 
# ⇒ 8 
+0

姆不錯的,那麼爲什麼它不與'p x.object_id'的情況? – 2013-03-03 09:25:49

+0

局部變量只是對象的引用。他們堅持在他們宣佈的範圍內。由於沒有聲明局部變量,ruby甚至會嘗試將'x'作爲類「Foo」的方法處理(請參閱_「或**方法**'x'for Foo:Class」_在錯誤消息中?成功了,它會拋出一個錯誤。 – mudasobwa 2013-03-03 09:30:39