做什么之间有什么区别:
file = open('myurl')
# Do stuff with file
并且正在做:
open('myurl') do |file|
# Do things with file
end
当我不使用块方法时,是否需要关闭并删除文件?如果是这样,我该如何关闭并删除它?我在docs
中看不到任何关闭/删除方法答案 0 :(得分:4)
OpenURI的文档对于初学者来说有点不透明,但#open
can be found here的文档。
那些文档说:
如果没有给出块,
#open
将返回类似IO的对象。否则它会产生IO对象并返回块的值。
这里的关键词是“IO - 像对象。”我们可以从中推断出该对象(在您的示例中为file
)将响应#close
方法。
虽然文档没有这么说,但通过查看来源,我们可以看到#open
将返回StringIO或Tempfile对象,具体取决于数据返回。 OpenURI的internal Buffer class首先初始化一个StringIO对象,但是如果输出的大小超过10,240字节,它会创建一个Tempfile并将数据写入它(以避免在内存中存储大量数据)。 StringIO和Tempfile都具有与IO一致的行为,因此最佳做法是(当没有将块传递给#open
时),在#close
中的对象上调用ensure
:
begin
file = open(url)
# ...do some work...
ensure
file.close
end
即使ensure
和begin
之间的代码引发异常,ensure
部分中的代码也始终会运行,因此这样可以确保file.close
被调用如果发生错误。