2013-11-23 73 views
3
  1. 何时分配给常量的Class对象获取垃圾回收?例如。什么时候在Ruby中收集常量垃圾回收?

    class Foo; end 
    Bar = Class.new {} 
    
  2. 什么时候在匿名类/模块中声明的常量得到垃圾回收?例如。

    foo = Class.new do 
        self::NAME = "Bar" 
    end 
    foo::NAME # Bar 
    foo = nil 
    GC.start 
    

    在上面的例子中,将声明的恒定NAME匿名类内被垃圾收集? (我假设匿名类会被垃圾收集..)

+0

通过“when”,你真的想知道“什么时候可以”吗?回答第一个是依赖于许多其他变量,第二个不是。 –

+0

@AndrewMarshall在场景1中,我想知道它是否会被垃圾收集。在场景2中,我想知道在提交垃圾收集请求时是否收集了“NAME”常量。 –

回答

3

可以很容易地熬下来到非常一般的情况:如果对象不再有任何引用,它可以被垃圾收集。请注意,我说对象,而不是变量。变量不是垃圾收集,对象是。


现在,让我们看看你给出的例子:

class Foo; end 
Bar = Class.new {} 

Class实例只会被垃圾收集如果常量他们分配到(如果有的话)被重新分配到不同的值(例如Bar = nil)并且没有该类的实例,并且没有从它继承的类。

foo = Class.new do 
    self::NAME = "Bar" 
end 
foo::NAME # Bar 
foo = nil 

先前在foo & foo::NAME的值可以是垃圾收集,如果有将它们的任何其它引用(即这个片段是完整的代码)。