Rubyのインスタンス変数とクラス変数とクラスインスタンス変数の違い

Rubyのインスタンス変数とクラス変数とクラスインスタンス変数の違いについてまとめる。

インスタンス変数

インスタンスごとに異なる値を保持する変数で、@で始まる変数名を使う。

主にクラス内部で宣言されたオブジェクトごとの状態を管理するために使われる。

クラス変数

クラス全体で共有される変数で、@@で始まる変数名を使う。

同じクラスの異なるインスタンス間で共有される値を保持するために使われる。

サブクラスでも共有される。

クラスインスタンス変数

クラス変数とは異なり、サブクラスとは共有されない。

クラス自身のインスタンス変数として使われる。

selfを使ってクラスメソッドの中でアクセスする。

違いのまとめ

変数の種類 宣言場所 スコープ サブクラスへの影響 用途
インスタンス変数 (@var) initialize やインスタンスメソッド内 各インスタンスごと 影響しない インスタンスごとのデータ管理
クラス変数 (@@var) クラス内 全インスタンスで共有 影響する(共有される) 全インスタンスで共通のデータ管理
クラスインスタンス変数 (@var in class context) クラスのトップレベル (self.@var) クラスごと 影響しない(クラスごとに独立) クラスごとのデータ管理