クラス変数
クラスに変数を持ちたい時にはクラス変数を定義すれば良い。@@というプレフィックスをつけるとクラス変数の定義して使うことができる。
1 2 3 4 5 6 7 8 9 10 11 | |
クラス変数はサブクラスや通常のインスタンスメソッドからアクセスすることもできる。上記のVariableクラスのclass_varを実行してみると
1 2 3 4 | |
普通にクラス変数の@@varを取得できる。しかし、クラス変数には少し使いにくいところがある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
こういうふうにクラス変数を変更する場合、このクラス変数にかかっている全てのオブジェクトに影響を与えるので実際の変数の値が変更されてしまう。ということで多くのRubyistはクラス変数は使ってない(らしい)。
インスタンス変数
インスタンス変数は@というプレフィックスをつけて使う。これはオブジェクトに所属していて、クラスとは何もつながりがない。なので、同じクラスのオブジェクトでもインスタンス変数の値はそれぞれ違う。インスタンス変数は値を代入した時に初めて出現する。だから明示的に定義しなくても良い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
クラスインスタンス変数
Rubyでは、全てのインスタンス変数はカレントオブジェクトselfに属している。クラスの定義の中ではselfはクラスのことになるから、下記にクラスに定義された@varはクラスに属していることになる。同じインスタンス変数@varだけどどこに定義されているかによって違い、それぞれ異なるスコープに定義されており、別々のオブジェクトに属している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1つ目instance_varメソッドで呼ばれた@varはvarオブジェクトがselfになる。つまり、varオブジェクトのインスタンス変数だ。2つ目のclass_instance_varのクラス変数で呼ばれた@varはVariableがselfになる。つまり、これはVariableオブジェクトのインスタンス変数だ。これはClassクラスのオブジェクトであるVariableに属しているので通常のインスタンス変数だ。これをクラスインスタンス変数と呼ぶ。
クラスインスタンス変数はクラスからしかアクセスできない。クラスのインスタンスやサブクラスからはアクセスできない。
参照
メタプログラミングRuby 45p - インスタンス変数
メタプログラミングRuby 144 ~ 146p - クラスインスタンス変数