2010-01-30 2 views
14

Ich verwende gets, um die Ausgabe meines Skripts anzuhalten, bis der Benutzer die Eingabetaste drückt. Wenn ich keine Argumente an mein Skript weitergebe, funktioniert es gut. Allerdings, wenn ich alle Argumente an mein Skript übergeben bekommt dann stirbt mit dem folgenden Fehler:Warum wird ein Fehler ausgegeben, wenn Argumente an mein Ruby-Skript übergeben werden?

ruby main.rb -i 
main.rb:74:in `gets': No such file or directory - -i (Errno::ENOENT) 
    from main.rb:74:in `gets' 
    ... 

Die Fehlermeldung das Argument zeigt ich an das Skript übergeben. Warum sollte man sich ARGV anschauen?

Ich verwende OptionParser, um meine Befehlszeilenargumente zu parsen. Wenn ich parse! anstelle von parse verwende (damit es Sachen entfernt, die es von der Argumentliste analysiert), dann funktioniert die Anwendung gut.

So sieht es aus wie gets liest aus ARGV aus irgendeinem Grund. Warum? Wird das erwartet? Gibt es einen Weg, um es nicht zu tun (tun gets() hat nicht geholfen).

Antwort

22

Ruby behandelt automatisch ungeparste Argumente als Dateinamen und öffnet und liest dann die Dateien, die die Eingabe für ARGF ($<) ermöglichen. Standardmäßig liest gets von ARGF. So umgehen Sie, dass:

$stdin.gets 

Es wurde vorgeschlagen, dass Sie STDIN statt $stdin verwenden könnte, aber es ist in der Regel better to use $stdin.

Zusätzlich, nachdem Sie die Eingabe, die Sie von ARGV wollen erfassen, können Sie verwenden:

ARGV.clear 

Dann werden Sie zu gets frei sein, ohne dass es von Dateien lesen Sie dürfen nicht zu lesen beabsichtigt haben.

4

Der ganze Punkt von Kernel#gets ist die Argumente an das Programm als Dateinamen übergeben und diese Dateien lesen. Der erste Satz in the documentation lautet:

Returns (and assigns to $_) the next line from the list of files in ARGV (or $*)

Das ist nur, wie gets funktioniert. Wenn Sie von einem Objekt speziellIO (z. B. $stdin) lesen möchten, rufen Sie einfach gets auf diesem Objekt.

Verwandte Themen