7-3-3 クラスで定義できる変数の種類をおさえよう
インスタンス変数
インスタンス変数は、クラスをnew
して生成されるオブジェクト(インスタンス)に限って共通で使用できる変数です。
インスタンスに閉じた範囲でのみ使用できる変数なので、インスタンス変数と呼ばれます。
クラス内でインスタンス変数を定義するには、アットマーク(@
)の後に変数名を記述します。
インスタンス変数は、アットマークを含めた「ひとかたまり」で定義されるため、アットマークを除いた変数とは実体が異なる点に注意が必要です。
前ページ「7-3-2 クラスに色々な変数を定義して使ってみよう」の例でいうと、initialize
メソッドで定義している、@price
とprice
はまったく別の変数を表していることになります。
@price
がインスタンス変数、price
はinitialize
メソッドの引数、つまり呼び出し元のnew
メソッドで指定された引数が代入されます。
クラス変数
クラス変数は、クラスのインスタンスすべてに共通で使用できる変数です。
インスタンス変数との違いは、あるインスタンスでクラス変数に対して行われた変更が、別のインスタンスでも適用されることです。
このように、クラス全体で共通で用いられる変数の特徴から、クラス変数と呼ばれます。
クラス内でクラス変数を定義するには、2つのアットマーク(@@
)の後に変数名を記述します。
インスタンス変数同様、1つのアットマークを削除したインスタンス変数と、2つのアットマークを削除した通常の変数とは実体が異なります。
前ページ「7-3-2 クラスに色々な変数を定義して使ってみよう」の例でいうと、@@tax_rate
はクラス変数、@tax_rate
はインスタンス変数、tax_rate
は通常の変数でそれぞれ独立した変数です。
定数
定数は、実はクラスに限った話ではなく、クラスの外でも直接指定することができます。
クラスの中に定数を定義する場合は、メソッドと同じ階層でclass
〜end
で囲まれた部分に記述します。
読みやすさの観点で、定数はクラス定義の先頭に記述することが多いです。
また、先頭大文字であれば定数と認識されますが、先頭大文字で後続の文字列が小文字の場合、クラス名と区別がつきづらいので、定数は全て大文字とアンダースコアを用いて定義することが多いです。
クラスに定義した定数は、クラス内部のメソッドから参照する場合、そのまま記述できます。
クラスに定義した定数をクラス外部から参照する場合、クラス名::定数名
と記述します。
なお定数は、後から変更の可能性がないことを前提としています。
Rubyでは、定数を変更しようとすると前ページ「7-3-2 クラスに色々な変数を定義して使ってみよう」の通り、定義済を示す警告メッセージが表示されますが、実際には定義済の定数を変更することが可能であることに注意が必要です。
クラスで定義できる変数の種類のまとめ
- クラスで定義できる変数には、インスタンス変数・クラス変数・定数などがある
- インスタンス変数は、インスタンス毎に独立している
- クラス変数は、クラス共通なので全てのインスタンスで共通している
- 定数は、後から変更する必要のない値を定義するために使う