Diferencia entre $ stdout y STDOUT en Ruby
stderr output-redirect (3)
En Ruby, ¿cuál es la diferencia entre $stdout
(precedido por un signo de dólar) y STDOUT
(en mayúsculas)? Al hacer la redirección de salida, ¿cuál debería usarse y por qué? Lo mismo STDERR
para $stderr
y STDERR
.
Editar: acabo de encontrar una pregunta relacionada .
Tanto $stdout
como STDOUT
tienen diferentes significados. La documentación de Ruby es bastante clara sobre este tema:
$stdout
- La salida estándar actual.STDOUT
- La salida estándar. El valor predeterminado para $ stdout.
Cuando desee escribir en la salida estándar, significa en realidad la salida estándar actual , por lo tanto, debe escribir en $stdout
.
STDOUT
no es inútil también. Almacena el valor predeterminado para $stdout
. Si alguna vez reasigna $stdout
, puede restaurarlo al valor anterior con $stdout = STDOUT
.
Además, hay una variable predefinida más:
$>
- La salida predeterminada para print, printf, que es$stdout
por defecto.
Sin embargo, parece que en Ruby 2.3 simplemente se comporta como un alias para $stdout
. La reasignación de $stdout
cambia el valor de $>
y viceversa.
$stdout
es una variable global que representa el resultado estándar actual. STDOUT
es una constante que representa la salida estándar y generalmente es el valor predeterminado de $stdout
.
Con STDOUT
como constante, no debe volver a definirlo, sin embargo, puede volver a definir $stdout
sin errores / advertencias (la redefinición de STDOUT
generará una advertencia). por ejemplo, puedes hacer:
$stdout = STDERR
Lo mismo vale para $stderr
y STDERR
Entonces, para responder la otra parte de su pregunta, use las variables globales para redirigir la salida, no las constantes. Solo tenga cuidado de volver a cambiarlo en su código, redefinir las variables globales puede afectar otras partes de su aplicación.
-
STDOUT
es una constante global, por lo que no debe modificarse. -
$stdout
es una variable predefinida, por lo que se puede cambiar.
Si está utilizando el intérprete de comandos para hacer la redirección:
$ ruby test.rb > test.log
entonces no importa cuál use como el descriptor de archivo para su script que se está determinando antes de que se ejecute su script.
Sin embargo, si intenta cambiar el descriptor de archivo para STDOUT del sistema operativo desde su script Ruby, por ejemplo, para enviar resultados a un conjunto rotatorio de archivos de registro basados en el día actual de la semana, entonces querrá asegurarse usted usa $stdout
.