我有一个返回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)?
答案 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
处理程序也不能保证运行。