91 votes

Différence entre $stdout et STDOUT en Ruby

En Ruby, quelle est la différence entre $stdout (précédé du signe dollar) et STDOUT (en majuscules) ? Lors d'une 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 un Question connexe .

0 votes

0 votes

@theTinMan C'est un peu un doublon. Cependant il faut noter que si les différences entre $stdout et STDOUT vs $stdin et STDIN sont symétriques, les différences entre $stdout et $> vs $stdin et $< ne le sont pas.

110voto

Brian Points 4711

$stdout est un variable globale qui représente la sortie standard actuelle. STDOUT est un constant représentant la sortie standard et est typiquement la valeur par défaut de $stdout .

Avec STDOUT étant une constante, vous ne devriez pas la redéfinir, cependant, vous pouvez redéfinir $stdout sans erreurs/alertes (redéfinir STDOUT entraînera un avertissement). Par exemple, vous pouvez faire :

$stdout = STDERR

Il en va de même pour $stderr et STDERR


Donc, pour répondre à l'autre partie de votre question, utilisez les variables globales pour rediriger la sortie, et non les constantes. Veillez simplement à les modifier plus loin dans votre code, car la redéfinition des variables globales peut avoir un impact sur d'autres parties de votre application.

3 votes

En fait, si vous voulez rediriger la sortie, vous devriez probablement utiliser $> le flux de sortie par défaut, et non $stdout .

10 votes

Je viens de trouver un commentaire sur une autre question qui dit $stdout et $> sont des alias, donc la réaffectation de l'un affectera l'autre.

9 votes

@jrdioko : Tu as raison. Apparemment, non seulement j'apprends quelque chose de nouveau chaque jour, mais j'oublie aussi quelque chose chaque jour :-)

7voto

skalee Points 3227

Les deux sites $stdout et STDOUT ont des significations différentes. La documentation de Ruby est assez clair sur ce sujet :

  • $stdout - La sortie standard actuelle.
  • STDOUT - La sortie standard. La valeur par défaut de $stdout.

Lorsque vous voulez écrire sur la sortie standard, vous voulez en fait utiliser la fonction actuel la sortie standard, vous devez donc écrire dans $stdout .

STDOUT n'est pas inutile non plus. Il enregistre la valeur par défaut de $stdout . Si jamais vous réassignez $stdout vous pouvez ensuite le rétablir à la valeur précédente avec $stdout = STDOUT .

En outre, il y a une autre variable prédéfinie :

  • $> - La sortie par défaut pour print, printf, qui est $stdout par défaut.

Cependant, il semble que dans Ruby 2.3, il se comporte simplement comme un alias de $stdout . Réaffectation de $stdout modifie la valeur de $> et vice versa.

5voto

shakerlxxv Points 139
  • 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 :

$ ruby test.rb > test.log

alors peu importe celui que vous utilisez puisque le descripteur de fichier de votre script est déterminé avant que votre script ne soit exécuté.

Cependant, si vous essayez de changer le descripteur de fichier pour le STDOUT du système d'exploitation à partir de votre script Ruby, par exemple pour envoyer la sortie vers un ensemble rotatif de fichiers journaux basés sur le jour actuel de la semaine, alors vous voudrez vous assurer que vous utilisez $stdout .

5 votes

"STDOUT est une constante globale, donc elle ne va pas changer". C'est une constante, qui PEUT être modifiée, mais un avertissement sera émis. STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>

0 votes

Ahh oui, il faut dire "pour qu'il ne soit pas modifié". Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X