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