使用YAML :: load时是否需要关闭文件?

时间:2011-09-05 13:08:37

标签: ruby

类似以下代码行

sites = YAML::load(File.open(SITESPATH))

是否需要更改为

File.open(SITESPATH) do |file|
  sites = YAML::load(file)
end

只是为了确保文件已关闭?

3 个答案:

答案 0 :(得分:3)

是的,您应关闭该文件,因此第二个示例是正确的。

正如旁注,请记住sites变量在块外不可见,除非您已在块之前创建它。

因为IO.open,当使用block调用时,返回块的值,您可以使用:

sites = File.open(SITESPATH) {|file| YAML::load(file) }

答案 1 :(得分:3)

您可以改用YAML.load_file(filename)

答案 2 :(得分:0)

这不是关于YAML :: load,而是关于文件/ IO流的一般情况。

没有块调用,File.open与File.new完全相同。这不会自己关闭文件,因此您需要自己关闭它。

来自 documentation

  

没有关联的阻止,[File。] open是IO.new的同义词。如果   给出了可选代码块,它将作为参数传递给io,   当块时,IO对象将自动关闭   终止。在这种情况下,IO.open返回块的值。