En Ruby, quelle est la différence entre $stdout
(précédé d'un signe dollar) et STDOUT
(en majuscules)? Lors de la redirection de sortie, laquelle doit être utilisée et pourquoi? Il en va de même pour $stderr
et STDERR
.
Edit: Je viens de trouver une question connexe .
ruby
stdout
stderr
output-redirect
jrdioko
la source
la source
$stdout
etSTDOUT
vs$stdin
etSTDIN
sont symétriques, les différences entre$stdout
et$>
vs$stdin
et$<
ne le sont pas.Réponses:
$stdout
est une variable globale qui représente la sortie standard actuelle.STDOUT
est une constante représentant la sortie standard et est généralement la valeur par défaut de$stdout
.Étant
STDOUT
une constante, vous ne devez pas la redéfinir, cependant, vous pouvez la redéfinir$stdout
sans erreurs / avertissements (la redéfinition déclencheraSTDOUT
un avertissement). par exemple, vous pouvez faire:Même chose pour
$stderr
etSTDERR
Donc, pour répondre à l'autre partie de votre question, utilisez les variables globales pour rediriger la sortie, pas les constantes. Veillez simplement à le modifier plus loin dans votre code, la redéfinition des variables globales peut avoir un impact sur d'autres parties de votre application.
la source
$>
le flux de sortie par défaut, pas$stdout
.$stdout
et$>
sont des alias, donc la réaffectation de l'un affectera l'autre.IO#reopen
en cas de$stdout
? Je suis totalement en désaccord avec cette opinion. La$stdout.reopen
méthode mute son récepteur et cela affectera égalementSTDOUT
si vous ne l'avez pas réaffecté$stdout
auparavant. Ils ne sont pas censés être des synonymes, il n'y a rien de mal quand ils détiennent des valeurs différentes en raison d'une affectation, et en rouvrant le,STDOUT
vous enfreignez son objectif.STDOUT
est une constante globale, elle ne doit donc pas être modifiée.$stdout
est une variable prédéfinie, elle peut donc être modifiée.Si vous utilisez le shell pour effectuer la redirection:
peu importe alors celui que vous utilisez comme descripteur de fichier pour votre script est déterminé avant que votre script ne soit exécuté.
Cependant, si vous essayez de modifier le descripteur de fichier pour le STDOUT du système d'exploitation à partir de votre script Ruby, par exemple pour envoyer la sortie à un ensemble rotatif de fichiers journaux en fonction du jour actuel de la semaine, vous voudrez vous assurer vous utilisez
$stdout
.la source
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Les deux
$stdout
etSTDOUT
ont des significations différentes. La documentation de Ruby est assez claire sur ce sujet:Lorsque vous voulez écrire sur la sortie standard, vous voulez dire en fait la sortie standard actuelle , vous devez donc écrire dans
$stdout
.STDOUT
n'est pas inutile aussi. Il stocke la valeur par défaut pour$stdout
. Si jamais vous réattribuez$stdout
, vous pouvez le restaurer à la valeur précédente avec$stdout = STDOUT
.De plus, il existe une autre variable prédéfinie:
Cependant, il ressemble à Ruby 2.3, il se comporte simplement comme un alias pour
$stdout
. Réaffecter$stdout
modifie la valeur de$>
et vice versa.la source