Ruby中的类变量垃圾收集?

Ruby中的类变量垃圾收集?,ruby,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 @co

我计划使用工厂方法来获取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的引用会保留什么内容,所以它会被垃圾收集吗?

@@instance
是一个类变量,而不是实例变量。该类保留对其类变量的引用,从而在类本身未定义之前阻止垃圾收集


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

当对象方法特定于该对象时,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
1.9.3p374:315>Jd=class Jd=Jd.new
TypeError:无法创建singleton类的实例
发件人(irb):316:在“新”中
发件人(irb):316
from/Users/rfatahi/.rvm/rubies/ruby-1.9.3-p374/bin/irb:16:in`'
1.9.3p374:317>Jd.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 
1.9.3p374:318>class MyClass
1.9.3p374:319?>结束
=>零
1.9.3p374:320>a=MyClass.new
=> # 
1.9.3p374:321>定义a.method1
1.9.3p374:322?>结束
=>零

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

def foo
  @foo ||= Foo.new
end

由于您定义了类Foo,根据定义,它不能是单例的;相反,当类未定义时,Singleton是默认值。您的类和实例变量是在类Foo中定义的,self将保存这些变量的值(类代表类变量,对象代表实例变量)@aug2uag您似乎很困惑。OP询问的是一个单例实例,这意味着一个经典的单例模式实现。也许你应该看看和Ruby的定义。OP并不是问ruby“singleton”(也称为本征或元)类。嗯,“在软件工程中,singleton模式是一种将类的实例化限制为一个对象的设计模式。”这是您提供的链接,也是我提到的。有趣的是,我去年开始编程。。。在我看来你是个糊涂虫son@aug2uag如果您没有感到困惑,那么为什么您的答案围绕着
class对不起,我知道@instance是一个类变量,这就是重点。也许正确的表达方式是使用工厂方法,它总是返回相同的单个实例,而不是单个实例(new将不起作用,因为它声明为private)
我的问题实际上是,什么对象保留在类对象本身上,以防止类变量(如@@instance)的垃圾收集?调用类方法后,它是否由层次结构顶部的某个应用程序对象引用和保留?