继承链中类实例变量的初始值

Posted

技术标签:

【中文标题】继承链中类实例变量的初始值【英文标题】:Initial value for class instance variable in inheritance chain 【发布时间】:2020-07-22 14:03:27 【问题描述】:

我想为每个类及其继承的类保存单独的值,并希望这些值最初为[]。所以我想到了使用实例类变量,因为它们不是跨继承链共享的:

module Foo
  def self.included(base)
    base.class_eval do
      @foos = []
    end

    base.extend ClassMethods
  end

  module ClassMethods
    attr_reader :foos
  end
end

我包含在其他有子类的类中

class Bar
  include Foo
end

class Baz < Bar
end

Bar.foos        # []
Baz.foos        # nil

所以,我的问题是,在不打开子类的情况下动态地将 Baz.foos 的值设置为 [] 而不是 nil 的最佳方法是什么?

我尝试使用类变量而不是实例类变量,但是所有类将共享类变量@@foos的同一个副本

谢谢

【问题讨论】:

def foos ; @foos ||= [] ; end 也许? 谢谢,@Stefan 这行得通 简直不敢相信这么简单。请随意回答,以便我标记您的答案。 【参考方案1】:

虽然@Stefan 在 cmets 中提供的建议可能是可行的方法,但元编程仍然是可能的;一个只需要handle inheritance。

module Foo
  def self.included(base)
    base.class_eval  @foos = [] 
    class << base
      attr_reader :foos
      def inherited(other)
        Foo.included(other)
      end
    end
  end
end

class Bar
  include Foo
end

class Baz < Bar; end

Bar.foos #⇒ []
Baz.foos #⇒ []

【讨论】:

谢谢,@Aleksei,知道如何在使用ActiveSupport::Concern而不是self.included(base)....时在class_methods块中使用inherited吗? 我不知道 ActiveSupport,抱歉。 谢谢,你很有帮助

以上是关于继承链中类实例变量的初始值的主要内容,如果未能解决你的问题,请参考以下文章

Java类继承关系中的初始化顺序

java中类变量、实例变量和局部变量有何区别?

python中类变量和实例变量

java中类变量和实例变量的实质区别?

JAVA基础之对象的初始化

python面向对象中类对象实例对象类变量实例变量类方法实例方法静态方法