Em Ruby, qual é a diferença entre $stdout
(precedido por um cifrão) e STDOUT
(em maiúsculas)? Ao fazer o redirecionamento de saída, o que deve ser usado e por quê? O mesmo vale para $stderr
e STDERR
.
Edit: Acabei de encontrar uma questão relacionada .
ruby
stdout
stderr
output-redirect
Jrdioko
fonte
fonte
$stdout
eSTDOUT
vs$stdin
eSTDIN
são simétricas, as diferenças entre$stdout
e$>
vs$stdin
e$<
não são.Respostas:
$stdout
é uma variável global que representa a saída padrão atual.STDOUT
é uma constante que representa a saída padrão e normalmente é o valor padrão de$stdout
.Por
STDOUT
ser uma constante, você não deve redefini-la, no entanto, você pode redefinir$stdout
sem erros / avisos (redefinirSTDOUT
gerará um aviso). por exemplo, você pode fazer:O mesmo vale para
$stderr
eSTDERR
Portanto, para responder à outra parte da sua pergunta, use as variáveis globais para redirecionar a saída, não as constantes. Apenas tome cuidado para alterá-lo mais adiante em seu código, a redefinição de variáveis globais pode afetar outras partes de seu aplicativo.
fonte
$>
o fluxo de saída padrão, não$stdout
.$stdout
e$>
são aliases, portanto, reatribuir um afetará o outro.IO#reopen
no caso de$stdout
? Eu discordo totalmente dessa opinião. O$stdout.reopen
método muda seu receptor e isso também afetaráSTDOUT
se você não tiver reatribuído$stdout
antes. Eles não devem ser sinônimos, não é nada ruim quando eles mantêm valores diferentes devido à atribuição e, ao reabrir o,STDOUT
você está quebrando seu propósito.STDOUT
é uma constante global, portanto, não deve ser alterada.$stdout
é uma variável predefinida, portanto, pode ser alterada.Se você estiver usando o shell para fazer o redirecionamento:
então, não importa qual você usa como descritor de arquivo para seu script, está sendo determinado antes de seu script ser executado.
No entanto, se você estiver tentando alterar o descritor de arquivo do STDOUT do sistema operacional de dentro do seu script Ruby, por exemplo, para enviar a saída para um conjunto rotativo de arquivos de log com base no dia atual da semana, então você vai querer ter certeza você usa
$stdout
.fonte
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Ambos
$stdout
eSTDOUT
têm significados diferentes. A documentação do Ruby é bastante clara neste tópico:Quando você quer escrever para a saída padrão, então você realmente quer dizer a saída padrão atual , portanto, você deve escrever para
$stdout
.STDOUT
não é inútil também. Ele armazena o valor padrão para$stdout
. Se você alguma vez reatribuir$stdout
, poderá restaurá-lo para o valor anterior com$stdout = STDOUT
.Além disso, há mais uma variável predefinida:
No entanto, parece que no Ruby 2.3, ele simplesmente se comporta como um alias para
$stdout
. Reatribuir$stdout
altera o valor de$>
e vice-versa.fonte