ruby-on-rails - Ruby——自动初始化子类的类实例变量,不继承值

标签 ruby-on-rails ruby ruby-on-rails-5 metaprogramming

我正在寻找一种通过继承自动初始化类变量的解决方案(使其可用作访问器并将其初始化为某个值)。但是我不想继承这个值,每次在每个类上都从一个新的新对象开始。

我一直在查看 class_attributes 并认为我找到了一个解决方法,但它似乎并没有像我想的那样工作(即使它工作了,它也很可能不会做我想的事情想要因为相同的数组将在任何地方使用,所以它的行为就像一个@@变量)

class AbstractClass
  class_attribute :metadata
  @metadata = [] # initialize metadata to an empty array

  def self.add_metadata(metadata)
    @metadata << metadata
  end
end

def ChildClass < AbstractClass
  add_metadata(:child_class1)
end

def ChildClass2 < AbstractClass
  add_metadata(:child_class2)
end 

我想要以下内容:

AbstractClass.metadata # Don't really care about this one
ChildClass1.metadata # => [:child_class1]
ChildClass2.metadata # => [:child_class2]

我可以想出一种方法,使用带有 AS::Support 的模块来做到这一点

module InitializeClassInstanceVars
  extend ActiveSupport::Concern 

  included do 
    class_attribute :metadata
    self.metadata = []
  end
end

...并将此模块包含在每个嵌套类中(我相信这就是 mongoid 实际做的事)

但我希望我可以通过继承直接做到这一点

最佳答案

类变量在被继承时不必初始化。 Ruby 风格是在变量未设置且第一次访问时返回并赋默认值。

只需为此创建另一个类方法:

class AbstractClass
  def self.metadata
    @metadata ||= []
  end

  def self.add_metadata(metadata)
    self.metadata << metadata
  end
end

class ChildClass1 < AbstractClass
  add_metadata(:child_class1)
end

class ChildClass2 < AbstractClass
  add_metadata(:child_class2)
end

AbstractClass.metadata # => []
ChildClass1.metadata # => [:child_class1]
ChildClass2.metadata # => [:child_class2]

关于ruby-on-rails - Ruby——自动初始化子类的类实例变量,不继承值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55724748/

相关文章:

ruby-on-rails - Rspec 系统测试在单独运行时通过,与整个套件一起运行时失败

css - 在 css ruby​​ on rails 4 错误中使用图像

mysql - 迁移错误 - 错误 : You have an error in your SQL syntax; check the manual that corresponds

ruby-on-rails - 如何根据另一个包含索引的数组对数组进行排序

ruby-on-rails - ActiveModel 动态属性类型

ruby - 在 Eclipse 中使用 ANT 任务执行 Sass。为什么我必须将 'executable' 设置为 'sass.bat' 而不是 'sass' ?

ruby - Bundle install 不会从私有(private) git repo 安装 gem

ruby - 安装 nokogiri 错误 : unrecognized command line option "-Wdivision-by-zero"

ruby-on-rails-5 - 在您的任何源路径中都找不到 "api_controller.rb"

ruby-on-rails - Rails 模型名称与包含的 gem 冲突