Ruby中释放对象的最佳实践

4

假设我有一个记录器类,该类具有指向已打开文件的属性。直到不再使用此类为止,该文件应保持打开状态。例如:

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个回答

3

只需通过方法调用关闭文件句柄。没有必要以其他方式关闭,尤其是等待垃圾回收器。如果您知道何时完成操作,请在那时进行清理。


4
您可以使用像 File.open 这样的方法,它接受一个块并处理打开和关闭文件句柄的操作。 - Chuck

0

如果您需要释放对象的资源,请显式地执行此操作。

我发现这个示例源代码很有帮助。


0

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


0

你需要一直打开日志文件吗?你可以在想要记录某些内容时进行打开/写入/关闭操作,并将该逻辑隐藏在MyLogger方法中。每次打开和关闭文件都会有一些开销,但除非你在循环中记录每个迭代,否则这种开销可能是微不足道的。

如果外部世界直接访问log_file,那么你手头的问题比手动关闭它更大。如果已经有一个大型代码库正在直接处理log_file,那么你可以用一个小对象来替换它,当某些人向它写入时,它会执行必要的打开/写入/关闭序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接