Ruby: наследовать код, который работает с переменными класса
Ситуация: у меня есть несколько классов, каждый из которых должен содержать переменную с конфигурационным хешем; различный хеш для каждого класса, но одинаковый для всех экземпляров класса.
Сначала я попробовал вот так
class A
def self.init config
@@config = config
end
def config
@@config
end
end
class B < A; end
class C < A; end
Но вскоре заметил, что это нетак не работает, потому что @@ config хранится в контексте A, а не B или C, таким образом:
B.init "bar"
p B.new.config # => "bar"
p C.new.config # => "bar" - which would be nil if B had it's own @@config
C.init "foo"
p B.new.config # => "foo" - which would still be "bar" if C had it's own @@config
p C.new.config # => "foo"
Я думал об использовании его так:
modules = [B, C]
modules.each do |m|
m.init(@config[m.name])
end
# ...
B.new # which should then have the correct config
Теперь это'Мне понятно, почему это происходит, но яЯ не уверен, почему это так.
не мог»Разве это работает иначе, держа переменную класса в контексте подкласса?
Что меня также раздражало, так это тот факт, что «я» всегда является подклассом, даже когда его называют «в' суперкласс. Исходя из этого, я сначала ожидал, что код из суперкласса "выполнено в контексте " подкласс.
Некоторое просвещение об этом будет высоко ценится.
С другой стороны, я, вероятно, должен признать, что это работает таким образом, и что я должен найти другой способ сделать это.
Есть ли "мета" способ сделать это? (Я пытался с class_variable_set и т. Д., Но без удачи)
Или, может быть, в этом вся идея?в этом' метод несовершенен в первую очередь и тамS какой-либо другой "шаблон" сделать это?
Я мог бы просто сделать @@ config хешем, содержащим все конфиги, и всегда выбирать правильный, но я нахожу это немного неловким .. (неT наследство, чтобы решить эту проблему? ;)