あまりクラス変数使わないし、たまに直感に反する挙動してハマることあるのでメモ。
継承を利用している場合、クラス変数を普通に使うと親クラスやサブクラスに伝搬してしまいます。
class Base
def self.foo=(value)
@@foo = value
end
def self.foo
@@foo
end
end
class Sub1 < Base
self.foo = 'sub1'
end
class Sub2 < Base
self.foo = 'sub2'
end
puts Base.foo #=> "sub2"
puts Sub1.foo #=> "sub2"
puts Sub2.foo #=> "sub2"
全部"sub2"になっちゃったYO!
意図通りな挙動を実現するためにはこんな感じ。
class Base
class << self
def foo=(value)
@foo = value
end
def foo
@foo
end
end
end
class Sub1 < Base
self.foo = 'sub1'
end
class Sub2 < Base
self.foo = 'sub2'
end
puts Base.foo #=> nil
puts Sub1.foo #=> "sub1"
puts Sub2.foo #=> "sub2"
これで期待通りの挙動になりました。