Differenza tra $ stdout e STDOUT in Ruby


91

In Ruby, qual è la differenza tra $stdout(preceduto dal segno del dollaro) e STDOUT(tutto maiuscolo)? Quando si esegue il reindirizzamento dell'output, quale dovrebbe essere utilizzato e perché? Lo stesso vale per $stderre STDERR.

Modifica: ho appena trovato una domanda correlata .



@theTinMan Un po 'è un duplicato. Tuttavia, va notato che mentre le differenze tra $stdoute STDOUTvs $stdine STDINsono simmetriche, le differenze tra $stdoute $>vs $stdine $<non lo sono.
skalee

Risposte:


109

$stdoutè una variabile globale che rappresenta l'output standard corrente. STDOUTè una costante che rappresenta lo standard output ed è in genere il valore predefinito di $stdout.

Con STDOUTessere una costante, non si deve ri-definire, tuttavia, è possibile ridefinire $stdoutsenza errori / avvertenze (ridefinizione STDOUTalzerà un avvertimento). ad esempio, puoi fare:

$stdout = STDERR

Lo stesso vale per $stderreSTDERR


Quindi, per rispondere all'altra parte della tua domanda, usa le variabili globali per reindirizzare l'output, non le costanti. Basta fare attenzione a cambiarlo di nuovo più avanti nel codice, la ridefinizione delle variabili globali può influire su altre parti dell'applicazione.


3
In realtà, se vuoi reindirizzare l'output, dovresti probabilmente usare $>, il flusso di output predefinito, non $stdout.
Jörg W Mittag

10
Ho appena trovato un commento su un'altra domanda che dice $stdoute $>sono alias, quindi riassegnarne uno influirà sull'altro.
jrdioko

9
@jrdioko: hai ragione. A quanto pare, non solo imparo qualcosa di nuovo ogni giorno, ma dimentico anche qualcosa ogni giorno :-)
Jörg W Mittag

2
E leggendo di più, sembra che sia meglio usare IO # reopen invece di un semplice compito.
jrdioko

@jrdioko Perché pensi che sia meglio usare IO#reopenin caso di $stdout? Sono totalmente in disaccordo con questa opinione. Il $stdout.reopenmetodo muta il suo ricevitore e ciò avrà effetto anche STDOUTse non lo hai riassegnato $stdoutprima. Non sono pensati per essere sinonimi, non è niente di male quando hanno valori diversi a causa dell'assegnazione e riaprendo STDOUTlo scopo.
skalee

5
  • STDOUT è una costante globale, quindi non dovrebbe essere modificata.
  • $stdout è una variabile predefinita, quindi può essere modificata.

Se stai usando la shell per fare il reindirizzamento:

$ ruby test.rb > test.log

quindi non importa quale si utilizza come descrittore di file per lo script viene determinato prima che lo script venga eseguito.

Tuttavia, se stai tentando di modificare il descrittore di file per STDOUT del sistema operativo dall'interno del tuo script Ruby, ad esempio per inviare l'output a un set rotante di file di registro in base al giorno corrente della settimana, ti consigliamo di assicurarti tu usi $stdout.


5
"STDOUT è una costante globale, quindi non cambierà". È una costante, che PU essere modificata, ma verrà emesso un avviso. STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Tin Man

Ahh sì, quindi dovrebbe dire "quindi non dovrebbe essere cambiato". Grazie!
shakerlxxv

5

Entrambi $stdoute STDOUThanno significati diversi. La documentazione di Ruby è abbastanza chiara su questo argomento:

  • $stdout - L'attuale standard di output.
  • STDOUT- Lo standard output. Il valore predefinito per $ stdout.

Quando vuoi scrivere sullo standard output, intendi effettivamente lo standard output corrente , quindi dovresti scrivere su $stdout.

STDOUTnon è anche inutile. Memorizza il valore predefinito per $stdout. In caso di riassegnazione $stdout, è possibile ripristinarlo al valore precedente con $stdout = STDOUT.

Inoltre, c'è un'altra variabile predefinita:

  • $>- L'output predefinito per print, printf, che è l' $stdoutimpostazione predefinita.

Comunque sembri che in Ruby 2.3 si comporta semplicemente come un alias per $stdout. La riassegnazione $stdoutcambia il valore di $>e viceversa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.