Ruby中的类变量垃圾收集?

时间:2013-03-10 06:20:37

标签: ruby

计划使用工厂方法来获取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在程序的生命周期内有一个连续递增的计数器。 / p>

但是,我不确定对类的实例变量@@ instance的引用是什么,所以它会被垃圾收集吗?

3 个答案:

答案 0 :(得分:2)

@@instance是一个类var,而不是一个实例var。该类包含对其类变量的引用,这可防止它们的垃圾收集,直到类本身未定义为止。

请不要滚动自己的单身人士模式。 stdlib有一个模块Singleton,您可以将它混合到您的类中以使其成为单例。 stdlib mixin会查找您忘记的详细信息,例如初始化的线程安全性和取消定义new

答案 1 :(得分:0)

使实例方法'foo'和与方法'@foo'同名的实例变量使用单例运算符||=分配或获取Foo的实例,如果您这样做这是从类方法中产生的内存泄漏

def foo
  @foo ||= Foo.new
end

答案 2 :(得分:-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