【问题标题】:Proper way to use `class_attribute` with `Hash`将 `class_attribute` 与 `Hash` 一起使用的正确方法
【发布时间】:2015-03-18 10:43:05
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails mutable class-variables


    【解决方案1】:

    诀窍是在父类中使用inherited方法:

    class Base
      class_attribute :options
      self.options = {}
    
      class << self
        def inherited(subClass)
          subClass.options = self.options.clone
        end
      end
    end
    

    这将在每次子类化时自动克隆父级的选项。

    【讨论】:

    • 很好的提示,为我节省了很多时间 - 但是由于inherited 钩子中的几个拼写错误/错误命名的变量/错误的接收器等,给定的代码示例不会像这样工作: 而不是self._options = self._options.clone 应该是subClass.options = self.options.clone ...
    猜你喜欢
    • 2014-08-30
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多