コンテンツにスキップ

クラス変数

クラス変数は、インスタンスではなくクラスに関連付けられます。クラス変数には、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  # => []

クラス変数は、モジュールと構造体にも関連付けることができます。上記と同様に、クラス変数は、型をインクルード/サブクラス化することによって継承されます。