ruby クラスインスタンス変数

2022.07.29

クラスインスタンス変数とは

クラス直下に@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

まとめ

クラスインスタンス変数はクラス直下に@変数名の形で定義する。

参照可能なのはクラスメソッドのみ(今調べた感じだと…)で子孫クラスで継承はできないと言う変数。

注意点としては、インスタンス変数と見た目が全く同じなので定義している位置に注目する。