我不认为类变量和实例变量之间存在明显差异。 类变量也可以看作实例变量。我对吗?
例如:
class Test
@class_var = 'hello world'
def self.show_class_var
@class_var
end
def show_class_var
puts self.class.show_class_var
end
end
因此,我认为我们可以将类变量视为当前类(Test
)的实例变量。如果我们定义@@class_var = 'hello world'
,唯一的好处是我们可以在实例方法中直接引用@@class_var
。我只是想知道我是对的。我呢?
答案 0 :(得分:3)
我认为“instance variable, class variable and the difference between them in ruby”对本地,实例和类变量之间的区别有很好的解释。
答案 1 :(得分:1)
我认为类变量和实例变量之间没有明显的区别。
没有微妙的区别。正如Wayne Conrad在his answer here中所述:
类变量(@@)在类及其所有后代之间共享。
类的后代不共享类实例变量(@)。
@@:类变量(我建议使用class instance variable
来代替class variable
,这样可以减少混淆,新手一般会这样做。) < / p>
class Foo;end
#setting class variable @@var
Foo.class_variable_set(:@@var, "good morning!")
#getting class variable @@var via Foo
Foo.class_variable_get(:@@var) # => "good morning!"
class Bar < Foo ;end
#getting class variable @@var via Bar subclass of Foo
Bar.class_variable_get(:@@var) # => "good morning!"
@:实例变量
class Foo;end
foo = Foo.new
#setting instance variable @var
foo.instance_variable_set(:@var, "good morning!")
#getting instance variable @var via foo object
foo.instance_variable_get(:@var) # => "good morning!"
class Bar < Foo ;end
bar = Bar.new
#getting instance variable @var via bar object,whose class is a subclass of Foo
bar.instance_variable_get(:@var) # => nil
答案 2 :(得分:1)
+1 OMG的答案,有一个转折点:不要忘记类本身就是对象,这意味着第三个不完全是类但不完全但实际上是实例类型的变量,班级本身。
示例:
class A
# instance variable of objects of class A (and its subclasses)
# not shared between instances
def foo; @foo; end
def foo=(foo); @foo = foo; end
class << self
# instance variable of class A
# not available to subclasses of A
def bar; @bar; end
def bar=(bar); @bar = bar; end
end
# class variable of A
# shared by subclasses of A
def baz; @@baz; end
def baz=(baz); @@baz = baz; end
end
class B < A; end
使用上述内容,您将获得:
a = A.new
b = B.new
a.foo = :foo
a.class.bar = :bar
a.baz = :baz
p a.foo # :foo
p a.class.bar # :bar
p a.baz # :baz
p b.foo # nil
p b.class.bar # nil
p b.baz # :baz