继承链中类实例变量的初始值
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,抱歉。
谢谢,你很有帮助以上是关于继承链中类实例变量的初始值的主要内容,如果未能解决你的问题,请参考以下文章