クラス変数の作成と使い方

クラス変数はクラスから生成されたすべてのインスタンスで共有される変数です。ここでは Ruby でクラス変数を作成する方法と使い方について解説します。

(Last modified: )

クラス変数とは

インスタンス変数はクラスから生成されたインスタンス毎に独立しており、インスタンス毎に異なる値を格納することができました。それに対してクラス変数はクラスから作成されたすべてのインスタンスで共有される変数となります。

すべてのインスタンスで共有されるため、どれかのインスタンスでクラス変数の値を変更した場合、別のインスタンスでクラス変数を参照したときに変更された値が取得されます。

クラス変数を作成する

クラス変数の変数名は @@ で始まります。例えば @@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")

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

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

次に initializeメソッドの中でクラス変数の値を +1 しています。 initialize メソッドはインスタンスが作成される度に実行されますので、インスタンスが作成される度にクラス変数の値が +1 されていくことになります。

サンプルコード

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

# encoding: UTF-8

class Car
  @@count = 0

  def initialize(carname="未定義")
    puts(carname + "を作成しました")
    @@count += 1
  end

  def getCount()
    return @@count;
  end

end

car1 = Car.new("crown")
puts("生成されたインスタンス数:" + car1.getCount().to_s)

car2 = Car.new("civic")
car3 = Car.new("alto")
puts("生成されたインスタンス数:" + car1.getCount().to_s)
puts("生成されたインスタンス数:" + car1.getCount().to_s)

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

クラス変数

3 つのインスタンスを生成したあとで、 2 つのインスタンスを使ってクラス変数の値を取得してみましたが、どちらも同じ値となっていることが確認できました。

-- --

Ruby でクラス変数を作成する方法と使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。