Rubyでは、$stdout
(ドル記号で始まる)とSTDOUT
(すべて大文字)の違いは何ですか?出力のリダイレクトを行うとき、どちらを使用する必要があり、なぜですか? $stderr
とSTDERR
についても同様です。
Edit:関連する質問 が見つかりました。
$stdout
は、現在の標準出力を表すグローバル変数です。 STDOUT
は、標準出力を表す定数であり、通常は$stdout
のデフォルト値です。
STDOUT
が定数であるため、再定義するべきではありませんが、$stdout
をエラー/警告なしで再定義できます(STDOUT
を再定義すると警告が発生します) )。たとえば、次のことができます。
$stdout = STDERR
$stderr
とSTDERR
についても同様です
したがって、質問の他の部分に答えるには、定数ではなくグローバル変数を使用して出力をリダイレクトします。コード内でさらに変更するように注意してください。グローバル変数を再定義すると、アプリケーションの他の部分に影響を与える可能性があります。
STDOUT
はグローバル定数であるため、変更しないでください。$stdout
は事前定義された変数なので、変更できます。シェルを使用してリダイレクトを行う場合:
$ Ruby test.rb > test.log
スクリプトを実行する前にスクリプトのファイル記述子が決定されているため、どちらを使用するかは重要ではありません。
ただし、Rubyスクリプト内からOSのSTDOUTのファイル記述子を変更しようとしている場合、たとえば、現在の曜日に基づいてログファイルのローテーションセットに出力を送信する場合、[$stdout
]を使用していることを確認する必要があります。
$stdout
とSTDOUT
の両方の意味は異なります。 Rubyのドキュメント は、このトピックではかなり明確です。
$stdout
–現在の標準出力。STDOUT
–標準出力。 $ stdoutのデフォルト値。
標準出力に書き込む場合、実際にはcurrent標準出力を意味するため、$stdout
に書き込む必要があります。
STDOUT
も無駄ではありません。 $stdout
のデフォルト値を保存します。 $stdout
を再割り当てした場合、$stdout = STDOUT
を使用して以前の値に復元できます。
さらに、定義済みの変数がもう1つあります。
$>
– print、printfのデフォルト出力。デフォルトでは$stdout
です。
ただし、Ruby 2.3のように見えますが、単に$stdout
のエイリアスとして動作します。$stdout
を再割り当てすると、$>
の値が変更されます。