当没有引用对象时,对象会发生什么特别的事情吗?

时间:2012-11-29 02:16:41

标签: ruby variables object reference

当没有变量指向它们时,对象是否会发生特殊情况?除了有资格进行垃圾收集之外,就是这样。

例如,目前,IO对象会自动关闭when they're garbage collected,如果他们还没有这样做的话。即使您想要更改此行为,也没有任何方法可以更改它,以便在没有更多变量指向对象时自动关闭,是吗?

(我的问题是略微简化:WeakRef允许变量指向对象,并使它们成为垃圾收集的目标。此外,它可以访问没有任何指向它们的变量的对象,对于Ruby的一些实现,通过使用ObjectSpace。对于IO对象,有像IO.open(&block)之类的东西在块执行后自动关闭IO对象。)

1 个答案:

答案 0 :(得分: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,它提供弱引用语义。 JRuby使用Java的本机弱引用语义实现WeakMap。 IOW:这个实际上不能在Ruby中表达,它必须由运行时系统提供。