En Ruby, ¿cuál es la diferencia entre $stdout
(precedido por un signo de dólar) y STDOUT
(en mayúsculas)? Al realizar la redirección de salida, ¿cuál debería usarse y por qué? Lo mismo ocurre con $stderr
y STDERR
.
Editar: Acabo de encontrar una pregunta relacionada .
ruby
stdout
stderr
output-redirect
jrdioko
fuente
fuente
$stdout
ySTDOUT
vs$stdin
ySTDIN
son simétricas, las diferencias entre$stdout
y$>
vs$stdin
y$<
no lo son.Respuestas:
$stdout
es una variable global que representa la salida estándar actual.STDOUT
es una constante que representa la salida estándar y suele ser el valor predeterminado de$stdout
.Al
STDOUT
ser una constante, no debe volver a definirla, sin embargo, puede volver a definirla$stdout
sin errores / advertencias (la redefiniciónSTDOUT
generará una advertencia). por ejemplo, puedes hacer:Lo mismo ocurre
$stderr
ySTDERR
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 más adelante en su código, la redefinición de variables globales puede afectar otras partes de su aplicación.
fuente
$>
la secuencia de salida predeterminada, no$stdout
.$stdout
y$>
son alias, por lo que reasignar uno afectará al otro.IO#reopen
en caso de$stdout
? Estoy totalmente en desacuerdo con esta opinión. El$stdout.reopen
método muta su receptor y eso también afectaráSTDOUT
si no ha reasignado$stdout
antes. No están destinados a ser sinónimos, no es nada malo cuando tienen valores diferentes debido a la asignación, y al reabrir elSTDOUT
mensaje estás rompiendo su propósito.STDOUT
es una constante global, por lo que no debe cambiarse.$stdout
es una variable predefinida, por lo que se puede cambiar.Si está utilizando el shell para realizar la redirección:
entonces no importa cuál use como descriptor de archivo para su secuencia de comandos se determina antes de que se ejecute su secuencia de comandos.
Sin embargo, si está intentando cambiar el descriptor de archivo para STDOUT del sistema operativo desde su script Ruby, por ejemplo, para enviar resultados a un conjunto rotativo de archivos de registro según el día actual de la semana, entonces querrá asegurarse de que usa
$stdout
.fuente
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Ambos
$stdout
ySTDOUT
tienen diferentes significados. La documentación de Ruby es bastante clara sobre este tema:Cuando desea escribir en la salida estándar, en realidad se refiere a la salida estándar actual , por lo que debe escribir en
$stdout
.STDOUT
tampoco es inútil. Almacena el valor predeterminado de$stdout
. Si alguna vez reasigna$stdout
, puede restaurarlo al valor anterior con$stdout = STDOUT
.Además, hay una variable predefinida más:
Sin embargo, parece que en Ruby 2.3 simplemente se comporta como un alias de
$stdout
. La reasignación$stdout
cambia el valor de$>
y viceversa.fuente