class Klass @iv = 1 @@cv = 2 def self.iv; @iv end def self.cv; @@cv end def iv; @iv end def cv; @@cv end end class SubKlass < Klass end # クラスのインスタンス変数を参照してみる Klass.iv #=> 1 SubKlass.iv #=> nil Klass.new.iv #=> nil SubKlass.new.iv #=> nil # クラス変数を参照してみる Klass.cv #=> 2 SubKlass.cv #=> 2 Klass.new.cv #=> 2 SubKlass.new.cv #=> 2
クラスのコンテキストで宣言されたインスタンス変数@iv
はClass
クラスのインスタンスKlass
に保持されているので、それを継承しているSubKlass
には共有されないし、またKlass
のインスタンスのコンテキストからputs @iv
という感じで参照することはできない。なのでインスタンスなど外部から参照する場合には、Klass.instance_variable_get(:@iv)
するか、setter/getterメソッドを定義する。
一方クラス変数@@cv
は、そうじゃない。どういう仕組みになっているかはわからないけど、SubKlass
にも共有されるし、インスタンスのコンテキストからもputs @@cv
という感じで参照することができる。