繁体   English   中英

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

[英]ruby Initializing instance variable outside method

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

class MyClass

    @var = 100

    def hello
      p "hello"
    end

end

我知道,如果我这样做MyClass.new@var没有那个对象上定义的,而我认为这将定义@var的类MyClass

有实际用途吗?

的确有用途:类变量。 普通的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

如果为@var访问器方法

MyClass.singleton_class.class_eval { attr_accessor :var }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM