如果我打开一个URI并按如下方式读取响应:
response = open("https://www.example.com")
result = response.read
工作正常,但如果我再次调用response.read,则返回一个空字符串。这似乎很奇怪。为什么会这样?
答案 0 :(得分:3)
因为OpenURI正在返回一个Tempfile
对象,这是File
类的特殊实现:
Tempfile对象的行为与File对象类似,您可以对其执行所有常用的文件操作:读取数据,写入数据,更改其权限等。因此,尽管此类未明确记录所有支持的实例方法文件,您实际上可以在Tempfile对象上调用任何File实例方法。
File
课程' parent是IO
对象。这意味着当您致电read
时,您正在呼叫IO
implementation of the method。
所有这一切意味着您在执行response.read
时正在阅读文件,而您在阅读文件结束前一直在阅读。这就是为什么你在第二次阅读时得到一个空字符串的原因,因为你正试图从文件末尾读取,而该文件没有任何内容。
以下是查看此内容的一种方法:
require 'open-uri'
response = open('http://google.com')
puts response.class # => Tempfile
puts response.read # => <!doctype html><html ...
puts response.pos # => 10941
puts response.read # => ""
response.rewind
puts response.pos # => 0
puts response.read # => <!doctype html><html ...