2017-06-01 17 views

回答

3

這是因爲OpenURI返回一個Tempfile對象,這是一個特殊的實施File類:

一個將它視爲對象的行爲就像一個文件對象,你可以在其上執行所有常用文件操作:讀取數據,寫入數據,更改權限等等。因此,雖然這個類沒有顯式地記錄File支持的所有實例方法,但實際上可以調用Tempfile對象上的任何File實例方法。

File類的父項是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 ... 
相關問題