クラスインスタンス変数

クラスインスタンス変数について纏めてみた。
Rubyの変数関連で結構ややこしい扱いのため、理解するのに苦労するポイントだと思う。


まず、クラスインスタンス変数とは何かだけど

といった特徴がある。
ここで注意する必要があるのがインスタンス変数と混同をし易いということ。

class ClassInstance
  @obj = :クラスインスタンス
  
  def self.access
    p  @obj      
  end
end

ClassInstance.access #クラスインスタンス

例えば上記のコードは単純にクラスインスタンス変数 obj にアクセスするだけの処理。
見ての通りメソッドへのアクセスはクラス.メソッド名で行われている。
ここでClassInstanceのインスタンスを宣言して、accessメソッドをコールしてみる。
勿論、仕様としてクラスメソッドでしかクラスインスタンス変数にはアクセス出来ないためエラーが発生する。

class ClassInstance
  @obj = :クラスインスタンス
  
  def self.access
    p  @obj      
  end
end

ClassInstance.access #クラスインスタンス
obj = ClassInstance.new
obj.access   #undefined method `access' for #<ClassInstance:0x007f8b6a052420>

この様にインスタンス側にはメソッドは実装されない。
つまり、クラスインスタンス変数にアクセスする際には必ずクラス名.メソッド名でアクセスする必要があり、
且つ継承対象にもならないため、クラス内部での安全性が保証されることになる。

逆にインスタンス変数はインスタンスごとにインスタンス変数へのアクセスが可能なため
クラスに共通した値の保持には適していない。
ただし、これについてはクラス変数が存在するため実際にクラスインスタンス変数を利用する場面は少ない様に感じられる。

ならクラスインスタンス変数はどの場面で使うのが良いかというと
クラス変数を継承時に継承対象外にしたい場合に使うのが適している...といったところだと思う。

調べてみて実際にクラスインスタンス変数を利用する場面はかなり少なそうな気もするけど
一応覚えておいて損は無いきがする。
特にこの辺を理解しておくとクラスメソッドインスタンスメソッドの違い等も理解できるので
コーディング時に迷うことが無くなる。