0

我认为class variableinstance variable之间没有明显区别。类变量也可以看作是一个实例变量。我对吗?

例如:

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在实例方法中引用。我只是想知道我是否正确。我是吗?

4

3 回答 3

3

我认为“ ruby 中的实例变量、类变量和它们之间的区别”很好地解释了本地、实例和类变量之间的区别。

于 2013-06-24T13:24:04.020 回答
1

我认为类变量和实例变量之间没有明显区别。

不,有细微的差别。正如韦恩康拉德在他的回答中所说:

类变量 (@@) 在类及其所有后代之间共享。

类实例变量 (@) 不被类的后代共享。

@@ : 类变量(我会推荐使用class instance variable代替。而不是说class variable,这将减少混乱,新手通常会这样做。)

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 
于 2013-06-24T13:13:07.570 回答
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
于 2013-06-24T13:35:36.167 回答