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

Har*_*tty 5 ruby garbage-collection

  1. Class分配给常量的对象何时会被垃圾回收?例如

    class Foo; end
    Bar = Class.new {}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 何时在匿名类/模块内声明的常量会被垃圾回收?例如

    foo = Class.new do
      self::NAME = "Bar"
    end
    foo::NAME  # Bar
    foo = nil 
    GC.start 
    
    Run Code Online (Sandbox Code Playgroud)

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

And*_*all 5

很容易将其归结为非常普遍的情况:如果对象不再具有对其的任何引用,则可以对其进行垃圾回收。请注意,我说的是对象,而不是变量。变量不是垃圾收集,对象是垃圾。


现在让我们看一下您给出的示例:

class Foo; end
Bar = Class.new {}
Run Code Online (Sandbox Code Playgroud)

Class仅当将分配给的常量(如果有)重新分配给其他值(例如Bar = nil)并且没有该类的实例并且没有从其继承的类时,这些实例才会被垃圾回收。

foo = Class.new do
  self::NAME = "Bar"
end
foo::NAME  # Bar
foo = nil
Run Code Online (Sandbox Code Playgroud)

如果没有其他引用,则foo&中先前的值foo::NAME可以被垃圾回收(即,此代码段是完整的代码)。