クラス変数

広告

クラス内で使用するインスタンス変数はクラスから作成されたオブジェクト毎に異なる値を格納できるものでした。それに対してクラス変数はクラスから作成された全てのオブジェクトで共有される変数となります。

全てのオブジェクトで共有されるため、あるオブジェクトを使ってクラス変数の値を更新した場合は、別のオブジェクトでクラス変数を参照すると更新された値を取得することになります。

クラス変数の変数名は「@@」で始まります。例えば「@@name」などです。ローカル変数などと同じく値が格納された時点から使用できるようになります。

class クラス名
  @@name = 値
end

クラス変数はメソッド内ではなく、定数と同じくクラス内のメソッド内では無い場所で定義します。

class Car
  @@count = 0

  def initialize(carname="未定義")
    @name = carname
    @@count += 1
  end

  def getCount()
    return @@count;
  end

end

car1 = Car.new("crown")
car2 = Car.new("civic")

print("現在生成されたオブジェクト数:", car1.getCount())

上記のサンプルの場合、まず「@@count = 0」でクラス変数の初期化が行われています。この初期化は最初のオブジェクトが作成された時に実行されますがそれ以降のオブジェクトが作成された時は実行されません。

次に「initialize」メソッドの中でクラス変数の値を「+1」しています。これはオブジェクトが作成される度に実行されますので、オブジェクトが作成される度にクラス変数の値が増加していくことになります。

サンプルプログラム

では実際に試してみます。

ClassTest8.rb

class Car
  @@count = 0

  def initialize(carname="未定義")
    @name = carname
    @@count += 1
  end

  def getCount()
    return @@count;
  end

end

car1 = Car.new("crown")
car2 = Car.new("civic")
car3 = Car.new("alto")

print("現在生成されたオブジェクト数:", car1.getCount())

上記を実行すると次のように表示されます。

クラス変数

今回は「car1」オブジェクトを使ってクラス変数の値を取得しましたが、他のオブジェクトを使ってクラス変数を取得しても同じ結果となります。

( Written by Tatsuo Ikura )