使用 `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 时自动克隆父项的选项。