Har*_*tty 5 ruby garbage-collection
Class分配给常量的对象何时会被垃圾回收?例如
class Foo; end
Bar = Class.new {}
Run Code Online (Sandbox Code Playgroud)何时在匿名类/模块内声明的常量会被垃圾回收?例如
foo = Class.new do
self::NAME = "Bar"
end
foo::NAME # Bar
foo = nil
GC.start
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,NAME匿名类内部声明的常量会被垃圾回收吗?(我假设匿名类将被垃圾收集。)
很容易将其归结为非常普遍的情况:如果对象不再具有对其的任何引用,则可以对其进行垃圾回收。请注意,我说的是对象,而不是变量。变量不是垃圾收集,对象是垃圾。
现在让我们看一下您给出的示例:
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可以被垃圾回收(即,此代码段是完整的代码)。