我想为每个类及其继承的类保存单独的值,并希望这些值最初为[]
。因此,我考虑使用实例类变量,因为它们不会在继承链之间共享:
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
谢谢
虽然@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 #⇒ []