Я ищу решение для автоматической инициализации переменной класса через наследование (сделать ее доступной в качестве средства доступа и инициализировать ее каким-либо значением). Но я НЕ хочу наследовать значение, просто начните с нового свежего объекта каждый раз в каждом классе.
Я смотрел на 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)
но я надеялся, что смогу сделать это напрямую через наследование