クラス変数¶
クラス変数は、インスタンスではなくクラスに関連付けられます。クラス変数には、2つのアットマーク(@@
)が接頭辞として付きます。例えば
class Counter
@@instances = 0
def initialize
@@instances += 1
end
def self.instances
@@instances
end
end
Counter.instances # => 0
Counter.new
Counter.new
Counter.new
Counter.instances # => 3
クラス変数は、クラスメソッドまたはインスタンスメソッドから読み書きできます。
クラス変数の型は、グローバル型推論アルゴリズムを使用して推論されます。
クラス変数は、サブクラスによって以下の意味で継承されます。型は同じですが、各クラスは異なるランタイム値を持ちます。例えば
class Parent
@@numbers = [] of Int32
def self.numbers
@@numbers
end
end
class Child < Parent
end
Parent.numbers # => []
Child.numbers # => []
Parent.numbers << 1
Parent.numbers # => [1]
Child.numbers # => []
クラス変数は、モジュールと構造体にも関連付けることができます。上記と同様に、クラス変数は、型をインクルード/サブクラス化することによって継承されます。