在Java中,我可以聲明一個類的公共成員,但似乎我不能在Ruby中這樣做。我可以聲明一個Ruby類成員嗎?
class Person
@a = 1
def hello()
puts(@a)
end
end
p = Person.new
p.hello()
#nil
爲什麼輸出nil
而不是1
?
在Java中,我可以聲明一個類的公共成員,但似乎我不能在Ruby中這樣做。我可以聲明一個Ruby類成員嗎?
class Person
@a = 1
def hello()
puts(@a)
end
end
p = Person.new
p.hello()
#nil
爲什麼輸出nil
而不是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
一個實例變量有@開頭的名稱,其範圍僅限於任何對象自我指。兩個不同的對象,即使它們屬於同一個類,也允許其實例變量具有不同的值。從對象外部,除了程序員明確提供的任何方法之外,實例變量不能被改變,甚至不能被觀察(即,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
。
下面是類和實例變量的一個很好的解釋http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ –