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 наследство, чтобы решить эту проблему? ;)

Ответы на вопрос(1)

Ваш ответ на вопрос