Was ist der Unterschied zwischen STDIN, $stdin in Ruby?
Ruby hat zwei Möglichkeiten, bezogen auf die standard-Eingabe: Die STDIN
konstant , und die $stdin
Globale variable.
Abgesehen von der Tatsache, dass ich die Zuweisung unterschiedlicher IO
Objekt $stdin
weil es nicht eine Konstante (z.B. vor der Gabelung umgeleitet IO in meine Kinder), was ist der Unterschied zwischen STDIN
und $stdin
? Wann sollte ich jede in meinem code?
Wenn ich neu zuweisen $stdin
, wirkt es STDIN
?
Und gilt das auch für STDOUT
/$stdout
und STDER
/$stderr
?
$stdin
ist hässlicher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
$stdin
zugewiesen ist,STDIN
ist nicht betroffen. Ebenfalls$stdin
ist nicht betroffen, wennSTDIN
zugewiesen ist (das ist durchaus möglich (obwohl sinnlos), aber erzeugt eine Warnung). Allerdings, wenn weder die variable zugewiesen wurde, werden Sie beide auf das gleiche IO-Objekt, so ruftreopen
1 auf wird man auf die anderen.Alle eingebauten ruby-Methoden verwenden
$<
(ein.k.ein.ARGF
) zu Lesen-Eingang. WennARGV
leer ist,ARGF
liest aus$stdin
, so dass, wenn Sie zum zuweisen$stdin
, das wird Auswirkungen auf alle built-in Methoden. Wenn Sie zum zuweisenSTDIN
wird es keine Wirkung haben, es sei denn, einige 3rd-party-Methode verwendetSTDIN
.In Ihrem eigenen code, den Sie verwenden sollten
$stdin
im Einklang mit den built-in methods2.1
reopen
ist eine Methode, die umleiten kann ein IO-Objekt zu einem anderen stream oder einer Datei. Aber Sie können es nicht verwenden, um die Umleitung eines E /a ein StringIO, so beseitigt Sie nicht alle Anwendungsfälle der Neuzuweisung$stdin
.2 können Sie natürlich auch verwenden
$<
/ARGF
noch mehr im Einklang mit den integrierten Methoden, aber die meisten der Zeit, die Sie nicht wollen dieARGF
Verhalten, wenn Sie explizit mit dem stdin-stream.$<
(die Standard-input-stream) und$>
(der Standard-output-stream) und weder$stdin
/STDIN
noch$stdout
/STDOUT
. In der Tat, das ist so ziemlich der springende Punkt, der$<
und$>
: Sie können die Umleitung der Eingabe-und Ausgabe-Methoden wieKernel#puts
ohne Auswirkungen auf stdin/stdout.$<
und$>
werde ich das korrigieren. Aber du bist nicht Recht zu Ihrem zweiten Punkt:$>
und$stdout
sind Aliase, so dass die Neuzuweisung wird man auf die anderen (im Gegensatz zu STDOUT bleibt unberührt).$<
ist das gleiche wieARGF
, sowohl von denen nicht zugewiesen werden. Allerdings Neuzuweisen$stdin
wird beeinflussen$<
undARGF
weilARGF
liest aus$stdin
wennARGV
leer ist.STDERR und $stderr auf die gleiche Sache zunächst; Sie können zuweisen, der die Globale variable, aber man sollte Sie nicht Durcheinander mit der Konstante. $stdin, STDIN, $stdout und STDOUT Paare sind ebenfalls.
Musste ich ändern STDERR ein paar mal als alternative zu monkey-patching einige Edelsteine ausgeben von Fehlermeldungen mit STDERR.puts. Wenn Sie zuweisen STDERR = $stdout erhalten Sie eine Warnung, und STDERR.öffnen('nul', 'w') versteht sich von selbst.