ruby在方法外初始化实例变量

时间:2012-07-22 01:10:37

标签: ruby variables instance

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

的代码
class MyClass

    @var = 100

    def hello
      p "hello"
    end

end

我知道如果我MyClass.new @var没有在该对象上定义,我认为这会在类@var上定义MyClass

这有实际用途吗?

2 个答案:

答案 0 :(得分:6)

有一个用途:类变量。正常的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

显然,这是无用的(除了事实上,与类实例变量不同,类变量也可以直接在实例方法中访问,而不是通过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

答案 1 :(得分:1)

如果您为@var

制作存取方法
MyClass.singleton_class.class_eval { attr_accessor :var }

然后您可以将@var视为类变量。不同之处在于它不会被MyClass的子类继承。

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