3

当不再有变量指向对象时,对象会发生什么特别的事情吗?除了有资格进行垃圾收集之外,就是这样。

例如,目前,IO 对象在被垃圾回收时会自动关闭,如果它们还没有这样做的话。即使您想更改此行为,也没有任何方法可以更改它,以便在没有更多变量指向对象时发生自动关闭,是吗?

(我的问题是稍微简化一下:WeakRef允许变量指向对象并让它们成为垃圾收集的目标。此外,对于 Ruby 的某些实现,可以通过以下方式访问没有任何变量指向它们的对象使用 ObjectSpace。关于 IO 对象,有这样的事情IO.open(&block)会在块执行后自动关闭 IO 对象。)

4

1 回答 1

1

不,当不再引用对象时,不会执行任何挂钩或特殊方法。

你提到的具体案例是:

  • 垃圾收集时自动关闭资源:这是通过终结器实现的

  • 在块结束时自动关闭资源:这里没有魔法

    class IO
      def self.open(*args)
        yield file_handle = new(*args)
      ensure
        file_handle.close
      end
    end
    
  • WeakRef: 这里有魔法:-) 在 YARV 中,lib/weakref.rb使用::ObjectSpace::WeakMap,它提供了弱引用语义。JRubyWeakMap使用 Java 的本机弱引用语义来实现。IOW:这实际上不能用 Ruby 表达,它必须由运行时系统提供。

于 2012-11-29T13:06:58.417 回答