在ruby中释放对象的最佳实践

时间:2010-10-28 18:50:31

标签: ruby

假设我有一个记录器类,其属性指向一个打开的文件。在不再使用此类之前,应该打开此文件。类似的东西:

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

在此之后,如果我尝试删除该文件,则会抛出错误,指出该文件正在使用中。

4 个答案:

答案 0 :(得分:3)

通过方法调用关闭文件句柄。以任何其他方式执行它并没有多大意义,尤其是等待垃圾收集器。如果你知道你已经完成了它,那么在那时做你的清理工作。

答案 1 :(得分:0)

如果您需要从对象释放资源,请明确执行此操作。

我发现this sample source code有帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如果外界正在直接访问log_file,那么您手上的问题比手动关闭它更大。如果已经存在一个直接搞乱log_file的大型代码库,那么你可以用一个小对象替换它,当一些对象写入时会执行必要的打开/写入/关闭序列。