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 $stderry STDERR.
Editar: Acabo de encontrar una pregunta relacionada .
ruby
stdout
stderr
output-redirect
jrdioko
fuente
fuente

$stdoutySTDOUTvs$stdinySTDINson simétricas, las diferencias entre$stdouty$>vs$stdiny$<no lo son.Respuestas:
$stdoutes una variable global que representa la salida estándar actual.STDOUTes una constante que representa la salida estándar y suele ser el valor predeterminado de$stdout.Al
STDOUTser una constante, no debe volver a definirla, sin embargo, puede volver a definirla$stdoutsin errores / advertencias (la redefiniciónSTDOUTgenerará una advertencia). por ejemplo, puedes hacer:Lo mismo ocurre
$stderrySTDERREntonces, 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.$stdouty$>son alias, por lo que reasignar uno afectará al otro.IO#reopenen caso de$stdout? Estoy totalmente en desacuerdo con esta opinión. El$stdout.reopenmétodo muta su receptor y eso también afectaráSTDOUTsi no ha reasignado$stdoutantes. No están destinados a ser sinónimos, no es nada malo cuando tienen valores diferentes debido a la asignación, y al reabrir elSTDOUTmensaje estás rompiendo su propósito.STDOUTes una constante global, por lo que no debe cambiarse.$stdoutes 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
$stdoutySTDOUTtienen 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.STDOUTtampoco 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$stdoutcambia el valor de$>y viceversa.fuente