当文件关闭时,ruby如何提供回调?

时间:2009-09-27 13:16:53

标签: ruby file callback hook

我有一个返回File对象的方法。我需要知道文件什么时候关闭。这不像覆盖close方法那么简单。如果文件被析构函数关闭,则不会调用close方法。

它应该像这样工作:

def something
    get_lock_on_file
    file File.new("foobar")
    file.on_close { release_lock_on_file }
    file
end

如何实现文件#on_close(& block)?

2 个答案:

答案 0 :(得分:3)

像这样定义某事 ......

def something
  get_lock_on_file
  yield file
  release_lock_on_file
end

..并使用它:

something do |file|
  ...
end

如果需要,使用错误处理块包装产量。

答案 1 :(得分:2)

恐怕你无能为力。如果没有调用File#close方法,那么当Ruby解释器退出时,操作系统实际上只会自动关闭该文件。换句话说:在文件关闭时,Ruby解释器(或者至少是你的程序)早已不复存在,因此无法通知你的程序。

我猜你可以通过

实现一些合理的覆盖
  • 覆盖File对象的#close方法,
  • 安装自己的终结器和
  • 安装at_exit处理程序。

但是,所有这些都存在问题:可能无法调用#close方法。终结器仅在对象被垃圾收集时运行,这可能比您预期的要晚得多(如果您从未耗尽内存,则垃圾收集器永远不会运行并且终结器永远不会被调用)。如果解释器崩溃,即使at_exit处理程序也不能保证运行。