这还是一个类变量吗?

时间:2013-05-28 11:46:02

标签: ruby class variables

我理解类变量应该以{{1​​}}开头。现在我有了这堂课:

@@

class C @v = "my variable" def self.get_v @v end end puts C.get_v #returns "my variable" 仍然是一个类变量吗?但它没有@v

3 个答案:

答案 0 :(得分:5)

不,它是类实例变量,即类对象C实例变量

两者之间的区别在于前者在层次结构的所有类中都是可见的,后者仅在定义它的类中可见。一个简单的例子(我希望)解释:

class A
  @a = 0  # class instance variable
  @@b = 1  # class variable
end

class B < A
  @a = 1
  @@b = 2
end

puts A.a # => 0
# the definition of @@b inside B have altered the value
# inside A. It's not the case for @a.
puts A.b # => 2

答案 1 :(得分:3)

不,它不是类变量。它是一个常规实例变量。但它属于Class对象的实例。重要的是不要混淆两者。

答案 2 :(得分:2)

如下所述进行内省,你会得到答案:

class C
  @v = "my variable"

  def self.get_v
    defined? @v
  end
end

puts C.get_v  #=> instance-variable

class C
  @v = "my variable"
  def self.get_v
    self.instance_variables
  end
end

puts C.get_v  #=> @v

这意味着@v类实例变量

class C
  @v = "my variable"
  def self.get_v
    self.new.instance_variables
  end
end

p C.get_v  #=> [] 

这是因为@v不是class C实例的实例变量

您也可以对类变量进行相同的内省:

class C
  @@v = "my variable"
  def self.get_v
    defined? @@v
  end
end

p C.get_v  #=> "class variable

总之,我可以说如上所述向您的对象提问,它有适合您的答案。