周りを見回すと、クラス変数とクラスインスタンス変数の比較がいくつか見つかります.クラス変数について私が聞いた中で最高のものは「それはあなたが望むものかもしれません」ですが、それが彼らが望むものであると誰かが言うのを聞いたことがありません. 、または継承ツリー全体で変数を共有する状況がより役立つ場合があります。
では、実際には、クラス インスタンス変数よりもクラス変数の方が適しているのはどのような場合でしょうか。
周りを見回すと、クラス変数とクラスインスタンス変数の比較がいくつか見つかります.クラス変数について私が聞いた中で最高のものは「それはあなたが望むものかもしれません」ですが、それが彼らが望むものであると誰かが言うのを聞いたことがありません. 、または継承ツリー全体で変数を共有する状況がより役立つ場合があります。
では、実際には、クラス インスタンス変数よりもクラス変数の方が適しているのはどのような場合でしょうか。
別の例(すべてのオブジェクトに一意の名前が必要)
class Foobar
@@uniqueId = 0
def initialize
@@uniqueId += 1
end
def unique_name
"Foobar_" + @@uniqueId.to_s
end
end
a = Foobar.new
puts a.unique_name
a = Foobar.new
puts a.unique_name
これは出力します
Foobar_1
Foobar_2
編集:シングルトンパターンは静的変数リンクの良い例でもあります
最も簡単な例は、クラス変数を使用して、そのクラスの概要状態またはすべてのインスタンスの共有状態を格納することです。
class Foobar
@@total = 0
def initialize
@@total += 1
end
class << self
def all
@@total
end
end
end
5.times { Foobar.new }
Foobar.all #=> 5
したがって、ここで@@totalは、合計として作成されたインスタンスの数を示します。
Rails のActiveRecord#FinderMethods#allは、単に配列のサイズを返します。ただし、クラスのすべてのインスタンスが配列にラップされていない場合は、クラス変数を使用して「すべて」を返すことも解決策です。