使用 `class_attribute` 和 `Hash` 的正确方法
Proper way to use `class_attribute` with `Hash`
Rails 有一个名为 class_attribute
的 class 扩展,它允许继承 class 实例变量。这适用于不可变对象,例如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" }
问题是如何让 subclasses 拥有自己的 options
副本,而无需在它们的主体中明确初始化它:
class SubClass < Base
self.options = {}
end
诀窍是在父级中使用 inherited
方法 class:
class Base
class_attribute :options
self.options = {}
class << self
def inherited(subClass)
subClass.options = self.options.clone
end
end
end
这将在每次子classed 时自动克隆父项的选项。
Rails 有一个名为 class_attribute
的 class 扩展,它允许继承 class 实例变量。这适用于不可变对象,例如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" }
问题是如何让 subclasses 拥有自己的 options
副本,而无需在它们的主体中明确初始化它:
class SubClass < Base
self.options = {}
end
诀窍是在父级中使用 inherited
方法 class:
class Base
class_attribute :options
self.options = {}
class << self
def inherited(subClass)
subClass.options = self.options.clone
end
end
end
这将在每次子classed 时自动克隆父项的选项。