2009-07-27 5 views
1

Dans quel but y at-il $ deferr, $ defout et pourquoi il n'y a pas $ defin s'il y a $ stderr, $ stdout et $ stdin, et aussi STDIN, STDOUT et STDERR

changer aucun d'entre eux ne changera pas d'autres

Répondre

7

STDIN, STDOUT et STDERR sont des constantes de flux globaux (par exemple les valeurs par défaut). $ Stdin, $ stdout et $ stderr sont des variables globales initialisées à la valeur des constantes du flux. Cela vous permet de modifier leurs valeurs au moment de l'exécution (par exemple, pour modifier la sortie stdout vers un autre périphérique de sortie).

$ defout est un moyen de créer un flux de sortie "in-situ". Il y a une brève discussion sur la liste de diffusion rubis ici:

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

vous ne peut évidemment pas avoir un flux d'entrée en place, donc il n'y a pas de « $ Defin ».

Cependant, ceci est principalement pour l'intérêt historique; Je crois que $ defout et $ deferr ont été dépréciés il y a quelque temps avec la sortie de Ruby 1.8.2, et la meilleure pratique actuelle est d'utiliser seulement $ stdin, $ stdout et $ stderr.

+0

Si j'exécute des lignes de la page ruby-talk, mais ajouter un code plus ruby ​​ ruby -p -i.bak -e 'STDERR.puts $stdout, $defout, $stderr, $deferr; $_.upcase!' junk, alors je vois que stdout $ est égal à $ defout et stderr $ est égal à Deferr $. Aussi, si j'exécute ruby -e '$stdout = File.open("junk", "w"); print "output"', alors la chaîne « sortie » sera en indésirable de fichiers. Puis-je supposer qu'il vaut mieux oublier $ defout et $ deferr car ils sont dépréciés? – tig

+0

Oui, c'est ce que je ferais. N'hésitez pas à accepter (cocher) cette réponse si cela vous est utile! –