在Java中,我可以声明一个类的公共成员,但似乎我不能在Ruby中这样做。
class Person
@a = 1
def hello()
puts(@a)
end
end
p = Person.new
p.hello()
#nil
为什么输出nil
而不是1
?
答案 0 :(得分: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的实例变量永远不会公开),除非程序员明确提供了任何方法。与全局变量一样,实例变量在初始化之前具有nil值。
现在看看: -
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
。