何时在Ruby中收集常量垃圾?

时间:2013-11-23 20:49:23

标签: ruby garbage-collection

  1. 分配给常量的Class对象什么时候收集垃圾? E.g。

    class Foo; end
    Bar = Class.new {}
    
  2. 什么时候在匿名类/模块中声明的常量会被垃圾收集? E.g。

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

    在上面的示例中,匿名类中声明的常量NAME是否会被垃圾回收? (我假设匿名类将被垃圾收集..)

1 个答案:

答案 0 :(得分:5)

很容易将其归结为一般情况:如果一个对象不再有任何引用,它可以被垃圾收集。请注意,我说 object ,而不是变量。变量不是垃圾收集,对象是。


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

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进行垃圾回收(即此代码段是完整代码)。