2016-10-09 2 views
0

Hallo, ich bin ein Neuling Ruby zu lernen Ich übe die Daten aus der Datei

puts "what is your filename?" 
filename = $stdin.gets.chomp 

von der Linie zwei, die ich den Dateinamen erhält ich will, kann zu bekommen zu lesen Allerdings, wenn ich schreibe nur gets.chomp wird es in einen Fehler Ich habe bereits $ stdin bedeutet Standard-Eingabe, aber immer noch nicht verstehen kann dies kann mir jemand helfen? THX

+0

oh Ich finde, dass gets.chomp kann auch funktionieren !! Also, ich kann nicht realisieren, was $ stdin jetzt funktioniert @@ – shinyMao

Antwort

0

Wenn gets Aufruf ohne den Strom zu spezifizieren wir den Aufruf Kernel#gets und wenn Strom angegeben wir Aufruf IO#gets

Ich glaube Kernel#gets umschlingt IO#gets unter der Haube, aber bevor es muss ein IO-Objekt erstellen, dass Das IO-Objekt wird eine Verkettung aller Befehlszeilenargumente (ARGV) sein (es wird versucht, jeden einzelnen als Datei in der Positionsreihenfolge zu öffnen) und sie lesen daraus. Wenn auf ARGV keine Elemente mehr vorhanden sind, liest es von stdin.

Das kann Verhalten mit diesem einfachen Snippet getestet werden:

while gets 
     puts $_ 
end 

Wenn ruby myscript.rb ohne Parameter ausgeführt wird stdin lesen, wenn Parameter angegeben werden es versuchen, wie Dateien zu öffnen und daraus lesen, wird es funktioniert ähnlich wie cat Befehl.

Dass Strom tty sein könnte, socket, Datei etc:

stream = File.open('/etc/passwd','r') 

puts stream.gets 

stream.close 

Eine einfache http-Client-Sockets:

require 'socket' 

s = TCPSocket.new 'icanhazip.com',80 

s.puts <<~EOF 
GET/HTTP/1.1 
Host: icanhazip.com 

EOF 

while line = s.gets 
     puts line 
end 

s.close 

More about Kernel#gets here

More about IO#gets

+2

"Wenn der Stream nicht angegeben ist, liest es aus' $ stdin' "- Wenn Sie sprechen über [' Kernel # bekommt's] (http: // ruby-doc .org/core/Kernel.html # method-i-gets), dann nein, tut es nicht. Wenn Sie irgendein Argument übergeben, wird es zuerst alles in 'ARGV' als Dateinamen interpretieren und davon lesen, und erst nachdem es alle in' ARGV' genannten Dateien gelesen hat, liest es aus der Standardeingabe (ähnlich wie [' ARGF'] (http://ruby-doc.org/core-2.4.0_preview2/ARGF.html) funktioniert). (Und, BTW, ich bin nicht einmal sicher, ob es dann von '$ stdin' liest, oder von '$ <'.) –

+0

@ JörgWMittag du hast Recht, ich bearbeite meine Antwort – Tiago

+0

_ "gets ist eine Methode was liest eine Zeile aus einem Stream, wenn der Stream nicht angegeben ist, wird es ... "_ - Sie beschreiben zwei verschiedene Methoden, als ob sie eins sind. Ersteres ist die Instanzmethode ['IO # gets'] (http://ruby-doc.org/core-2.3.1/IO.html#method-i-gets), letztere ist die globale Funktion [' Kernel # bekommt'] (http://ruby-doc.org/core-2.3.1/Kernel.html#method-i-gets). – Stefan