Ruby: Code erben, der mit Klassenvariablen funktioniert

Die Situation: Ich habe mehrere Klassen, die jeweils eine Variable mit einem Konfigurations-Hash enthalten sollen. ein unterschiedlicher Hash für jede Klasse, aber derselbe für alle Instanzen einer Klasse.

Zuerst habe ich es so versucht

class A
  def self.init config
    @@config = config
  end

  def config
    @@config
  end
end

class B < A; end
class C < A; end

Aber schon bald stellte sich heraus, dass es so nicht funktionieren würde, weil @@ config im Kontext von A gehalten wird, nicht von B oder C, also:

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"

Ich dachte daran, es so zu benutzen:

modules = [B, C]
modules.each do |m|
  m.init(@config[m.name])
end
# ...
B.new  # which should then have the correct config

Jetzt ist mir klar, warum das passiert, aber ich bin mir nicht sicher, warum das so ist.

Konnte es nicht auch andersherum funktionieren, die Klassenvariable im Kontext der Unterklasse zu halten?

Was mich auch irritierte, war die Tatsache, dass Selbst immer die Unterklasse ist, auch wenn es in der Oberklasse genannt wird. Von diesem erwartete ich zunächst, dass der Code aus der Oberklasse im Kontext der Unterklasse "ausgeführt" wird.

Einige Aufklärung darüber wäre sehr dankbar.

Andererseits muss ich wahrscheinlich akzeptieren, dass es so funktioniert und dass ich einen anderen Weg finden muss, um dies zu tun.

Gibt es eine "Meta" -Methode, um dies zu tun? (Ich habe es mit class_variable_set etc. versucht, aber ohne Glück)

Oder ist vielleicht die ganze Idee dieser 'Init'-Methode fehlerhaft und es gibt ein anderes "Muster", um dies zu tun?

Ich könnte einfach @@ config zu einem Hash machen, der alle Configs enthält und immer die richtige auswählt, aber ich finde das etwas umständlich. (Gibt es keine Vererbung, um diese Art von Problem zu lösen?;)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage