Rubyのクラス変数(@@変数)とは?全インスタンスで共有する値を管理する
Rubyのクラス変数(@@変数)は、クラスとそのすべてのインスタンス間で共有される変数です。
@@count
のように、@@
を変数名の先頭に付けて定義します。
クラス全体で共通のデータを扱いたいときに便利ですが、使い方に注意が必要な変数でもあります。
クラス変数の基本
class Dog
@@count = 0
def initialize
@@count += 1
end
def self.total
puts "作られた犬の数:#{@@count}"
end
end
Dog.new
Dog.new
Dog.total # → 作られた犬の数:2
この例では、@@count
が すべてのDogインスタンスで共有されていることがわかります。
クラスメソッドと相性が良い
クラス変数は、クラスメソッド(self.method名)からも直接参照・更新できます。
class Counter
@@value = 0
def self.increment
@@value += 1
end
def self.show
puts @@value
end
end
Counter.increment
Counter.increment
Counter.show # → 2
インスタンス変数との違い
項目 | インスタンス変数 | クラス変数 |
書き方 | @name | @@name |
有効範囲 | インスタンスごと | クラス全体で共有 |
初期値 | nil(未設定でも使える) | 初期化しないとエラー |
継承に関する注意点
class Animal
@@count = 0
end
class Cat < Animal
def initialize
@@count += 1
end
end
class Dog < Animal
def initialize
@@count += 1
end
end
Cat.new
Dog.new
puts "動物の数:#{@@count}" # → エラーや想定外の動作に注意
クラス変数は、継承先のクラスとも共有されるため、クラス単位で独立した変数がほしい場合は @変数
や クラスインスタンス変数
を使う方が安全です。
クラスインスタンス変数との違い
@変数
をクラス定義の中で使うと、「クラス自身に属するインスタンス変数」になります。
これは継承先で共有されません。
class Example
@value = 100
def self.show
puts @value
end
end
Example.show # → 100
クラス変数の使いどころ
- 全インスタンスで共通の値をカウント・記録したいとき
- グローバル変数を避けつつ、共有データを扱いたいとき
- シンプルな用途で、継承による影響がない場合
まとめ
Rubyのクラス変数(@@変数)は、クラス全体とそのインスタンスで共有される変数です。
initialize
内での使用やクラスメソッドとの併用で、共通のカウント・設定などに役立ちます。
ただし、継承や複雑な構造の中で使うと予期しない挙動になることがあるため、必要最低限の用途に絞って使うのがおすすめです。