2009-07-27 5 views
1

Für welchen Zweck gibt es $ Deferr, $ defout und warum gibt es kein $ defining wenn es $ stderr, $ stdout und $ stdin, und auch STDIN, STDOUT und STDERR

ändern einer von ihnen nicht andere ändern

Antwort

7

STDIN, STDOUT und STDERR sind globale Strom Konstanten (dh Standardwerte).

$ stdin, $ stdout und $ stderr sind globale Variablen, die auf den Wert der Stromkonstanten initialisiert werden. Dadurch können Sie ihre Werte zur Laufzeit ändern (z. B. um stdout in ein alternatives Ausgabegerät zu ändern).

$ defout ist eine Möglichkeit, einen 'In-Place'-Ausgabestrom zu erstellen. Es gibt eine kurze Diskussion über die Ruby-Mailingliste hier:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/67822

Natürlich kann man nicht einen direkten Eingangsstrom hat, so gibt es kein ‚$ defin‘.

Jedoch, dies ist hauptsächlich für historisches Interesse; Ich glaube, dass $ defout und $ deferr vor einiger Zeit mit der Veröffentlichung von Ruby 1.8.2 veraltet waren, und die beste Vorgehensweise ist, nur $ stdin, $ stdout und $ stderr zu verwenden.

+0

Wenn ich Linien von Ruby-Talk-Seite aus, sondern etwas mehr Ruby-Code ruby -p -i.bak -e 'STDERR.puts $stdout, $defout, $stderr, $deferr; $_.upcase!' junk, dann sehe ich, dass $ stdout ist gleich $ defout und $ stderr ist gleich $ Deferr hinzuzufügen. Auch wenn ich ruby -e '$stdout = File.open("junk", "w"); print "output"' ausführen, dann Zeichenfolge "Ausgabe" wird in der Datei Junk sein. Kann ich annehmen, dass es besser ist, nur $ defout und $ deferr zu vergessen, da sie veraltet sind? – tig

+0

Ja - das würde ich machen. Fühlen Sie sich frei, diese Antwort zu akzeptieren (ankreuzen), wenn es hilfreich ist! –