2013-03-10 65 views
-1

正在计划使用工厂方法来获取ruby类的单例实例,但我不确定它是否将使用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可能在该计划的整个生命周期中,都有一个连续上升的计数器。

但是,我不确定什么可能持有对类的实例变量@@实例的引用,所以它会得到垃圾回收?

回答

1

@@instance是一个类var,而不是一个实例var。该类持有对其类变量的引用,这会阻止它们的垃圾回收,直到类本身未定义。

请不要推出自己的单身模式。 stdlib有一个模块Singleton,你可以将它混入你的类,使它成为一个单例。 stdlib mixin会关注你忘记的细节,例如初始化和未定义的线程安全new

+0

因为你定义类Foo,根据定义它不能是单件;相反,当类未定义时,Singleton是默认值。你的类和实例变量是在Foo类中定义的,而self将保存那些值(类变量类和对象变量) – aug2uag 2013-03-10 06:53:18

+0

@ aug2uag你似乎很困惑。 OP询问一个单例实例,这意味着一个典型的单例模式实现。也许你应该看看[Singleton Pattern](http://en.wikipedia.org/wiki/Singleton_pattern)和Ruby的[Singleton Module](http://www.ruby-doc.org/stdlib-1.9)的定义0.3/libdoc /单/的RDoc/Singleton.html)。操作系统并没有问红宝石“单身”(aka eigen-或meta-)类。 – dbenhur 2013-03-10 18:02:39

+0

um“在软件工程中,单例模式是一种设计模式,它将类的实例化限制为一个对象。” 这是从你提供的链接,正是我所处理的。有趣的是,我去年开始编程......看起来你是一个迷茫的儿子 – aug2uag 2013-03-10 19:34:39

-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