【问题标题】:Does anything special happen to objects when there are no references to them?当没有对它们的引用时,对象会发生什么特别的事情吗?
【发布时间】:2012-11-17 01:19:22
【问题描述】:

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

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

(我的问题稍微简单了一点:WeakRef 允许变量指向对象并将它们作为垃圾收集的目标。此外,对于某些人来说,可以访问没有任何变量指向它们的对象Ruby 的实现,通过使用 ObjectSpace。关于 IO 对象,有类似IO.open(&block) 的东西会在块执行后自动关闭 IO 对象。)

【问题讨论】:

  • 作为回报,我的问题是,您是否正在解决问题,或者这是学术/好奇心?我希望看到一些显示问题/好奇心的代码示例。
  • 您可以根据需要关闭 GC。
  • @theTinMan 我试图在stackoverflow.com/questions/764134/… 回复评论,但我对评论的回复只有 95% 的把握。

标签: ruby variables object reference


【解决方案1】:

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

你提到的具体案例是:

  • 在垃圾回收时自动关闭资源:这是通过 finalizer

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

    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 表达,它必须由运行时系统提供。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2022-06-27
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2014-08-13
    • 2023-04-08
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多