クラス変数
クラスに変数を持ちたい時にはクラス変数を定義すれば良い。@@
というプレフィックスをつけるとクラス変数の定義して使うことができる。
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 - クラスインスタンス変数