2017-06-01 3 views
1

Wenn ich öffnen Sie eine URI und die Antwort lautet wie folgt:Warum öffnet ('uri'). Lese die Antwortdaten löschen?

response = open("https://www.example.com") 
result = response.read 

Das funktioniert gut, aber wenn ich dann wieder anrufen response.read eine leere Zeichenkette zurückgegeben. Das scheint ein seltsames Verhalten zu sein. Warum ist das der Fall?

Antwort

3

Es ist, weil openURI ein Tempfile Objekt zurückgibt, die eine spezielle Implementierung der File Klasse:

A Tempfile Objekte verhält sich wie ein File-Objekt, und Sie können alle üblichen Dateioperationen darauf ausführen : Lesen von Daten, Schreiben von Daten, Ändern der Berechtigungen usw. Obwohl diese Klasse nicht explizit alle von File unterstützten Instanzmethoden dokumentiert, können Sie tatsächlich jede Dateiinstanzmethode für ein Tempfile-Objekt aufrufen.

Und ein File Klasse Eltern ist ein IO Objekt. Das heißt, wenn Sie read anrufen, rufen Sie eine IO implementation of the method.

Was alles bedeutet, dass Sie eine Datei lesen, wenn Sie response.read tun und Sie bis Ende der Datei lesen. Aus diesem Grund erhalten Sie beim zweiten Lesen eine leere Zeichenfolge, weil Sie versuchen, vom Ende der Datei zu lesen, die nichts enthält.

Hier ist ein Weg, dies zu prüfen und sehen, was los ist:

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 ...