1
如果我打開一個URI和讀取響應如下:爲什麼open('uri')。read刪除響應數據?
response = open("https://www.example.com")
result = response.read
這工作正常,但同樣,如果我再調用response.read返回一個空字符串。這看起來很奇怪。爲什麼會這樣?
如果我打開一個URI和讀取響應如下:爲什麼open('uri')。read刪除響應數據?
response = open("https://www.example.com")
result = response.read
這工作正常,但同樣,如果我再調用response.read返回一個空字符串。這看起來很奇怪。爲什麼會這樣?
這是因爲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 ...