我可以声明一个Ruby类成员吗?

时间:2013-08-29 18:16:05

标签: ruby class member

在Java中,我可以声明一个类的公共成员,但似乎我不能在Ruby中这样做。

class Person
  @a = 1

  def hello()
    puts(@a)
  end
end

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

为什么输出nil而不是1

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

Instance variables

  

实例变量的名称以@开头,其范围仅限于自己引用的任何对象。两个不同的对象,即使它们属于同一个类,也允许它们的实例变量具有不同的值。从对象外部,实例变量不能被改变甚至观察(即,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