クラスインスタンス変数とは
クラス直下に@hogeと定義したもの。インスタンスの中で定義したものではない。
クラスインスタンス変数はクラスメソッドの中のみで使用できる。
特徴
クラス直下に定義する。インスタンスメソッド内に定義するとインスタンス変数になってしまう。
最初は『@numが2に変わるんだね〜』とか思ってたけど違う。クラスインスタンス変数とインスタンス変数は別物であることが下記のコードでわかる。
class Hoge
@num = 1
def initialize
@num = 2
end
end
#クラスがロードされた場合
p Hoge.instance_variable_get(:@num) #=> 1
#インスタンスが作成された場合
p Hoge.new.instance_variable_get(:@num) #=> 2
#もう1度呼び出してもクラスインスタンス変数は変わっていない。
p Hoge.instance_variable_get(:@num) #=> 1
参照できるのはクラスメソッド内からのみ。インスタンスメソッドやプライベートメソッドからはアクセスできない。
class Hoge
@num = 1
def a
p @num
end
def self.b
p @num
end
private
def c
p @num
end
end
Hoge.b #=> 1
Hoge.new.a #=> nil
Hoge.new.c #=> nil
子孫クラスからは参照できない。インスタンス変数は継承可能。
class Hoge
@num = 1
def initialize
@num = 2
end
end
class Hoge2 < Hoge
end
p Hoge2.instance_variables #=> []
p Hoge2.new.instance_variables #=> [:@num]
p Hoge2.instance_variable_get(:@num) #=> nil
p Hoge2.new.instance_variable_get(:@num) #=> 2
まとめ
クラスインスタンス変数はクラス直下に@変数名の形で定義する。
参照可能なのはクラスメソッドのみ(今調べた感じだと…)で子孫クラスで継承はできないと言う変数。
注意点としては、インスタンス変数と見た目が全く同じなので定義している位置に注目する。