与open-uri的区别与没有它的区别

时间:2014-05-27 21:57:36

标签: ruby open-uri

做什么之间有什么区别:

file = open('myurl')
# Do stuff with file

并且正在做:

open('myurl') do |file|
 # Do things with file
end

当我不使用块方法时,是否需要关闭并删除文件?如果是这样,我该如何关闭并删除它?我在docs

中看不到任何关闭/删除方法

1 个答案:

答案 0 :(得分:4)

OpenURI的文档对于初学者来说有点不透明,但#open can be found here的文档。

那些文档说:

  如果没有给出块,

#open将返回类似IO的对象。否则它会产生IO对象并返回块的值。

这里的关键词是“IO - 像对象。”我们可以从中推断出该对象(在您的示例中为file)将响应#close方法。

虽然文档没有这么说,但通过查看来源,我们可以看到#open将返回StringIOTempfile对象,具体取决于数据返回。 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

即使ensurebegin之间的代码引发异常,ensure部分中的代码也始终会运行,因此这样可以确保file.close被调用如果发生错误。