Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中发布对象的最佳实践_Ruby - Fatal编程技术网

在ruby中发布对象的最佳实践

在ruby中发布对象的最佳实践,ruby,Ruby,假设我有一个logger类,它有一个指向打开文件的属性。此文件应一直打开,直到不再使用此类为止。比如: class MyLogger attr_accessor :log_file def initialize @log_file = File.new('my_log_file_name.log','w') end def finalize(id) @log_file.close end end 如何确保不再使用此实例时,文件句柄将关闭?我试过这个,但没有

假设我有一个logger类,它有一个指向打开文件的属性。此文件应一直打开,直到不再使用此类为止。比如:

class MyLogger
  attr_accessor :log_file
  def initialize
    @log_file = File.new('my_log_file_name.log','w')
  end

  def finalize(id)
    @log_file.close
  end
end
如何确保不再使用此实例时,文件句柄将关闭?我试过这个,但没有效果:

l = MyLogger.new
l = nil
ObjectSpace.garbage_collect

在此之后,如果我尝试删除该文件,它将抛出一个错误,指出该文件正在使用。

如果需要从对象释放资源,请显式执行


我发现很有帮助。

只需通过方法调用关闭文件句柄。用任何其他方法都没有意义,尤其是等待垃圾收集器。如果你知道你什么时候完成了,在那一点上进行清理

由于Ruby垃圾收集器在不可预知的时间运行,因此无法知道析构函数代码何时运行。如果每次在一个方法调用中打开和关闭该文件可能会更好。

是否需要一直打开日志文件?当您想要记录某些内容并将该逻辑隐藏在MyLogger方法中时,可以执行打开/写入/关闭操作。始终打开和关闭文件会有一些开销,但这种开销可能无关紧要,除非您在循环中记录每个迭代


如果外部世界直接访问日志文件,那么与手动关闭相比,您面临的问题更大。如果已经有一个大的代码库直接干扰了日志文件,那么您可以用一个小对象来替换它,该对象在某些写入时执行必要的打开/写入/关闭顺序。

您可以使用类似
file.open
的方法,该方法需要一个块并为您打开和关闭文件句柄。