代码之家  ›  专栏  ›  技术社区  ›  johannes

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

  •  0
  • johannes  · 技术社区  · 16 年前

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

    它应该这样工作:

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

    如何在关闭(&block)时实现文件?

    2 回复  |  直到 12 年前
        1
  •  2
  •   Jörg W Mittag    16 年前

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

    我想你可以通过

    • 重写 File 对象的 #close 方法,
    • 安装自己的终结器和
    • 安装一个 at_exit 处理程序。

    然而,所有这些都有它们的问题: 关闭 可能无法调用方法。只有当对象被垃圾收集时,才会运行终结器,这可能比您预期的要晚得多(并且,如果您从未耗尽内存,则垃圾收集器永远不会运行,终结器永远不会被调用)。甚至 阿特出口 如果解释器崩溃,则不保证处理程序运行。

        2
  •  3
  •   yawn    16 年前

    定义 某物 这样地。。。

    def something
      get_lock_on_file
      yield file
      release_lock_on_file
    end
    

    …像这样使用:

    something do |file|
      ...
    end
    

    如果需要,用错误处理块包装yield。

    推荐文章