当没有变量指向它们时,对象是否会发生特殊情况?除了有资格进行垃圾收集之外,就是这样。
例如,目前,IO对象会自动关闭when they're garbage collected,如果他们还没有这样做的话。即使您想要更改此行为,也没有任何方法可以更改它,以便在没有更多变量指向对象时自动关闭,是吗?
(我的问题是略微简化:WeakRef允许变量指向对象,并使它们成为垃圾收集的目标。此外,它可以访问没有任何指向它们的变量的对象,对于Ruby的一些实现,通过使用ObjectSpace。对于IO对象,有像IO.open(&block)
之类的东西在块执行后自动关闭IO对象。)
答案 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中表达,它必须由运行时系统提供。