Rails有一个名为class_attribute
的类扩展,它允许继承类实例变量。这适用于不可变对象,例如, String
,但没有变数:
class Base
class_attribute :options
self.options = {}
end
class SubClass < Base
end
Base.options # {}
SubClass.options[:foo] = "bar" # { foo: "bar" }
Base.options # { foo: "bar" }
问题是如何让子类拥有自己的options
副本而不在其体内明确初始化它:
class SubClass < Base
self.options = {}
end
答案 0 :(得分:3)
诀窍是在父类中使用inherited
方法:
class Base
class_attribute :options
self.options = {}
class << self
def inherited(subClass)
subClass.options = self.options.clone
end
end
end
这将在每次子类化时自动克隆父选项。