Di Ruby, apa perbedaan antara $stdout
(diawali dengan tanda dolar) dan STDOUT
(dalam huruf besar semua)? Saat melakukan pengalihan keluaran, mana yang harus digunakan dan mengapa? Hal yang sama berlaku untuk $stderr
dan STDERR
.
Edit: Baru saja menemukan pertanyaan terkait .
ruby
stdout
stderr
output-redirect
jrdioko
sumber
sumber
$stdout
danSTDOUT
vs$stdin
danSTDIN
adalah simetris, sedangkan perbedaan antara$stdout
dan$>
vs$stdin
dan$<
tidak.Jawaban:
$stdout
adalah variabel global yang mewakili keluaran standar saat ini.STDOUT
adalah konstanta yang mewakili keluaran standar dan biasanya merupakan nilai default$stdout
.Dengan
STDOUT
menjadi sebuah konstanta, Anda tidak boleh mendefinisikannya kembali, namun, Anda dapat mendefinisikan ulang$stdout
tanpa kesalahan / peringatan (mendefinisikan ulangSTDOUT
akan menimbulkan peringatan). misalnya, Anda dapat melakukan:Hal yang sama berlaku untuk
$stderr
danSTDERR
Jadi, untuk menjawab bagian lain dari pertanyaan Anda, gunakan variabel global untuk mengarahkan keluaran, bukan konstanta. Berhati-hatilah untuk mengubahnya lebih lanjut dalam kode Anda, mendefinisikan ulang variabel global dapat memengaruhi bagian lain dari aplikasi Anda.
sumber
$>
aliran keluaran default, bukan$stdout
.$stdout
dan$>
merupakan alias, jadi penugasan ulang satu akan mempengaruhi yang lain.IO#reopen
jika terjadi$stdout
? Saya sangat tidak setuju dengan pendapat ini. The$stdout.reopen
Metode bermutasi penerima dan yang juga akan mempengaruhiSTDOUT
jika Anda belum ditugaskan$stdout
sebelumnya. Mereka tidak dimaksudkan untuk menjadi sinonim, tidak ada yang buruk ketika mereka memiliki nilai yang berbeda karena tugas, dan dengan membuka kembaliSTDOUT
Anda melanggar tujuannya.STDOUT
adalah konstanta global, jadi tidak boleh diubah.$stdout
adalah variabel yang telah ditentukan sebelumnya, sehingga dapat diubah.Jika Anda menggunakan shell untuk melakukan pengalihan:
maka tidak masalah mana yang Anda gunakan sebagai deskriptor file untuk skrip Anda ditentukan sebelum skrip Anda dieksekusi.
Namun, jika Anda mencoba mengubah deskriptor file untuk STDOUT OS dari dalam skrip Ruby Anda, misalnya untuk mengirim output ke sekumpulan file log yang berputar berdasarkan hari saat ini dalam seminggu, maka Anda pasti ingin memastikan Anda gunakan
$stdout
.sumber
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
Keduanya
$stdout
danSTDOUT
memiliki arti yang berbeda. Dokumentasi Ruby cukup jelas tentang topik ini:Ketika Anda ingin menulis ke keluaran standar, maka yang Anda maksud adalah keluaran standar saat ini , jadi Anda harus menulis ke
$stdout
.STDOUT
tidak berguna juga. Ini menyimpan nilai default untuk$stdout
. Jika Anda pernah menetapkan ulang$stdout
, Anda dapat mengembalikannya ke nilai sebelumnya dengan$stdout = STDOUT
.Selain itu, ada satu lagi variabel standar:
Namun sepertinya di Ruby 2.3 itu hanya berperilaku sebagai alias untuk
$stdout
. Penetapan ulang$stdout
mengubah nilai$>
dan sebaliknya.sumber