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

问题描述 投票:0回答:1

我想为每个类及其继承的类保存单独的值,并希望这些值最初为[]。因此,我考虑使用实例类变量,因为它们不会在继承链之间共享:

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

谢谢

ruby inheritance module
1个回答
0
投票

虽然@Stefan在评论中提供的建议可能是可行的方法,但元编程仍然可以实现;一个只需要处理继承。

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 #⇒ []
© www.soinside.com 2019 - 2024. All rights reserved.