-1

Ruby クラスのシングルトン インスタンスを取得するためにファクトリ メソッドを使用することを計画していましたが、Ruby ガベージ コレクションで動作するかどうかはわかりません。

EGのようなものがある場合:

class Foo
def self.getInstance
  @@instance = Foo.new if @instance.nil?
  return @@instance
end

def counter
   @counter
end

 def increment
   @counter++
end

 private

 def initialize
     @counter = 0
 end
end

したがって、これが他の言語で機能する方法は、 @instance がガベージコレクションを無期限に存続することに精通しているため、 Foo.getInstance.increment は、プログラムの存続期間中、継続的に上昇するカウンターを持つことができます。

ただし、クラスのインスタンス変数 @@instance への参照が保持されている可能性があるかどうかはわかりませんが、ガベージ コレクションは行われますか?

4

3 に答える 3

2

@@instanceインスタンス変数ではなく、クラス変数です。クラスは、クラス自体が未定義になるまでガベージ コレクションを防止するクラス変数への参照を保持します。

独自のシングルトン パターンを作成しないでください。stdlib にはモジュールSingletonがあり、クラスに mixin してシングルトンにすることができます。stdlib mixin は、初期化のスレッド セーフや undefining など、忘れていた詳細を処理しますnew

于 2013-03-10T06:34:02.607 に答える
-2

Singleton クラスは、オブジェクト メソッドがそのオブジェクトに固有の場合に移動する場所であり、各オブジェクトはそのようなクラスを保持するか、または保持することができます。

1.9.3p374 :315 > Jd = class<<self;self;end
 => #<Class:#<Object:0x007ff304078d08>> 
1.9.3p374 :316 > jd = Jd.new
TypeError: can't create instance of singleton class
    from (irb):316:in `new'
    from (irb):316
    from /Users/rfatahi/.rvm/rubies/ruby-1.9.3-p374/bin/irb:16:in `<main>'
1.9.3p374 :317 > Jd.class
 => Class

Singleton クラスへのメソッドの追加:

1.9.3p374 :318 > class MyClass
1.9.3p374 :319?>   end
 => nil 
1.9.3p374 :320 > a = MyClass.new
 => #<MyClass:0x007ff30605b530> 
1.9.3p374 :321 > def a.method1
1.9.3p374 :322?>   end
 => nil 
于 2013-03-10T08:25:21.237 に答える