概要
クラス変数はクラスの全員スタンスで共通して参照・定義される変数。各インスタンスが共通の資産を利用するような場合に使われる。
定義方法
クラス変数の定義方法は以下の通り。
- クラス定義の直下に書く
- 変数の頭に
'@@'
をつける - メソッド内で使うときも
'@@'
をつける
1 2 3 4 5 6 7 8 9 10 11 |
class MyClass @@counter = 0 def show_counter() puts @@counter end def increment() @@counter += 1 end end |
このクラス変数に対して、各インスタンスから変更を加えたときの挙動を以下に示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
instance1 = MyClass.new instance1.show_counter instance1.increment instance1.show_counter # 0 # 1 instance2 = MyClass.new instance2.show_counter instance2.increment instance2.show_counter # 1 # 2 instance1.show_counter # 2 |
なお、クラス変数はカプセル化されており、クラス・インスタンスのどちらからも直接には参照・定義できない。
1 2 3 4 5 6 7 |
puts MyClass.counter # ERROR # in `<main>': undefined method `counter' for MyClass:Class (NoMethodError) puts instance1.counter # ERROR # in `<main>': undefined method `counter' for #<MyClass:0x0000000005145cf8> (NoMethodError) |
インスタンス変数と同様にgetter/setterを定義することで参照可能になる。