我理解类变量应该以{{1}}开头。现在我有了这堂课:
@@
class C
@v = "my variable"
def self.get_v
@v
end
end
puts C.get_v #returns "my variable"
仍然是一个类变量吗?但它没有@v
?
答案 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
总之,我可以说如上所述向您的对象提问,它有适合您的答案。