在ruby中发布对象的最佳实践
假设我有一个logger类,它有一个指向打开文件的属性。此文件应一直打开,直到不再使用此类为止。比如:在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 如何确保不再使用此实例时,文件句柄将关闭?我试过这个,但没有
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
的方法,该方法需要一个块并为您打开和关闭文件句柄。