web-dev-qa-db-fra.com

Différence entre $ stdout et STDOUT dans Ruby

Dans 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 devrait être utilisée et pourquoi? C'est la même chose pour $stderr et STDERR.

Edit: Je viens de trouver un question connexe .

87
jrdioko

$stdout est un 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.

Avec STDOUT étant une constante, vous ne devez pas la redéfinir, cependant, vous pouvez redéfinir $stdout sans erreurs/avertissements (redéfinir STDOUT déclenchera un avertissement). par exemple, vous pouvez faire:

$stdout = STDERR

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, pas les constantes. Faites juste attention à le modifier plus loin dans votre code, la redéfinition des variables globales peut avoir un impact sur d'autres parties de votre application.

103
Brian
  • 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 une redirection:

$ Ruby test.rb > test.log

alors peu importe celui que vous utilisez comme descripteur de fichier pour votre script est déterminé avant l'exécution de votre script.

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 de la semaine en cours , vous devez vous assurer d'utiliser $stdout.

5
shakerlxxv

Tous les deux $stdout et STDOUT ont des significations différentes. 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 dire en fait la sortie standard actuelle , vous devez donc écrire sur $stdout.

STDOUT n'est pas inutile non plus. Il stocke la valeur par défaut de $stdout. Si jamais vous réaffectez $stdout, vous pouvez alors restaurer la valeur précédente avec $stdout = STDOUT.

De plus, il existe une autre variable prédéfinie:

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

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

5
skalee