2

作为一个实验,我写了一些看起来像

class MyClass

    @var = 100

    def hello
      p "hello"
    end

end

我知道如果我这样做MyClass.new不是@var在那个对象上定义的,而是我认为这会@var在 class 上定义MyClass

这有实际用途吗?

4

2 回答 2

7

确实有一个用途:类变量。普通的 Ruby 类变量实现,@@在超类和它的子类之间共享相同的变量:

class A
  @@v = 0
  def self.v; @@v; end
  def self.v=(val); @@v=val; end
end
class B < A; end
A.v #-> 0
A.v= 3 #-> 3
B.v #->3
B.v= 42 #-> 42
A.v #-> 42

显然,这没什么用(除了与类实例变量不同的是,类变量也可以在实例方法中直接访问,而不是 through self.class)。但是与类实例变量相同的示例:

class A
  @v = 0
  def self.v; @v; end
  def self.v=(val); @v=val; end
end
class B < A; end
A.v #-> 0
A.v= 3 #-> 3
B.v= 42 #-> 42
A.v #-> 3

此外,类实例变量可以利用已经为实例变量编写的所有元编程,如下所示:

class Foo
  class << self
    attr_accessor :v #Uses a class instance variable
  end
end
于 2012-07-22T02:10:13.463 回答
1

如果您为@var

MyClass.singleton_class.class_eval { attr_accessor :var }

那么你可以@var像对待一个类变量一样对待。不同之处在于它不会被MyClass.

_why 在Dwemthy 的 Array中利用了这一点。

于 2012-07-22T01:45:35.483 回答