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 .
$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.
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
.
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.