2013-08-29 95 views
1

在Java中,我可以聲明一個類的公共成員,但似乎我不能在Ruby中這樣做。我可以聲明一個Ruby類成員嗎?

class Person 
    @a = 1 

    def hello() 
    puts(@a) 
    end 
end 

p = Person.new 
p.hello() 
#nil 

爲什麼輸出nil而不是1

+0

下面是類和實例變量的一個很好的解釋http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ –

回答

1

因爲實例變量@a未針對實例pr進行初始化。

class Person 
@a = 1 
    def hello() 
    puts(@a) 
    end 
end 

pr = Person.new 
pr.instance_variable_get(:@a) # => nil 

現在看到如下: -

class Person 
    def initialize(a) 
    @a=a 
    end 
    def hello() 
    puts(@a) 
    end 
end 

pr = Person.new(1) 
pr.instance_variables # => [:@a] 
Person.instance_variables # => [] 
pr.instance_variable_get(:@a) # => 1 
pr.hello # => 1 

Instance variables

一個實例變量有@開頭的名稱,其範圍僅限於任何對象自我指。兩個不同的對象,即使它們屬於同一個類,也允許其實例變量具有不同的值。從對象外部,除了程序員明確提供的任何方法之外,實例變量不能被改變,甚至不能被觀察(即,ruby的實例變量從不公開)。與全局變量一樣,實例變量在初始化之前具有零值。


現在看這裏: -

class Person 
@a = 1 
    def self.hello() 
    puts(@a) 
    end 
end 
Person.hello # => 1 
Person.instance_variables # => [:@a] 
Person.new.instance_variables # => [] 

因此,在這個例子中@a是對象Person的實例變量,而不是Person。非常好的建議的情況下,就在這裏 - Class Level Instance Variables

+0

所以它意味着我不能聲明它時初始實例變量? – user2730388

+0

每個對象都有自己的副本實例變量.. –

+0

現在完全瞭解,謝謝你的詳細解答! – user2730388

相關問題