The situation: I have multiple classes that should each hold a variable with a configuration hash; a different hash for each class but the same for all instances of a class.
At first, i tried like this
class A
def self.init config
@@config = config
end
def config
@@config
end
end
class B < A; end
class C < A; end
But soon noticed that it wouldn't work that way because @@config is held in the context of A, not B or C, thus:
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"
I thought of using it like this:
modules = [B, C]
modules.each do |m|
m.init(@config[m.name])
end
# ...
B.new # which should then have the correct config
Now, it's clear to me why that happens, but I'm not sure about the reason for it being like this.
Couldn't it work the other way too, holding the class variable in the context of the subclass?
What i also found irritating was the fact that self is always the subclass even when called 'in' the superclass. From this, I first expected the code from the superclass is "executed in the context of" the subclass.
Some enlightenment about this would be greatly appreciated.
On the other hand, I likely have to accept it works that way and that I have to find another way to do this.
Is there a "meta" way to do this? (I tried with class_variable_set etc. but with no luck)
Or maybe is the whole idea of that 'init' method flawed in the first place and there's some other "pattern" to do this?
I could just make @@config a hash, holding all the configs and always pick the right one, but I find that a little awkward.. (isn't inheritance there to solve this kind of problem? ;)