类似以下代码行
sites = YAML::load(File.open(SITESPATH))
是否需要更改为
File.open(SITESPATH) do |file|
sites = YAML::load(file)
end
只是为了确保文件已关闭?
答案 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返回块的值。