-1

计划使用工厂方法来获取 ruby​​ 类的单例实例,但我不确定它是否适用于 Ruby 垃圾收集。

例如,如果我有类似的东西:

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是类 var,而不是实例 var。该类持有对其类变量的引用,这会阻止它们的垃圾收集,直到类本身未定义。

请不要滚动您自己的单例模式。stdlib 有一个模块Singleton,您可以将其混入到您的类中以使其成为单例。stdlib mixin 会处理您忘记的细节,例如初始化和 undefining 的线程安全new

于 2013-03-10T06:34:02.607 回答
0

创建一个实例方法 'foo' 和一个与方法 '@foo' 同名的实例变量,使用单例运算符||=来分配或获取 的实例Foo,如果从类方法中执行此操作,则会产生内存泄漏

def foo
  @foo ||= Foo.new
end
于 2019-04-10T21:12:49.743 回答
-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 回答