Ruby的类变量和实例变量之间的区别

时间:2013-06-24 13:09:51

标签: ruby

我不认为类变量实例变量之间存在明显差异。 类变量也可以看作实例变量。我对吗?

例如:

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。我只是想知道我是对的。我呢?

3 个答案:

答案 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