web-dev-qa-db-ja.com

Rubyの$ stdoutとSTDOUTの違い

Rubyでは、$stdout(ドル記号で始まる)とSTDOUT(すべて大文字)の違いは何ですか?出力のリダイレクトを行うとき、どちらを使用する必要があり、なぜですか? $stderrSTDERRについても同様です。

Edit:関連する質問 が見つかりました。

87
jrdioko

$stdoutは、現在の標準出力を表すグローバル変数です。 STDOUTは、標準出力を表す定数であり、通常は$stdoutのデフォルト値です。

STDOUTが定数であるため、再定義するべきではありませんが、$stdoutをエラー/警告なしで再定義できます(STDOUTを再定義すると警告が発生します) )。たとえば、次のことができます。

$stdout = STDERR

$stderrSTDERRについても同様です


したがって、質問の他の部分に答えるには、定数ではなくグローバル変数を使用して出力をリダイレクトします。コード内でさらに変更するように注意してください。グローバル変数を再定義すると、アプリケーションの他の部分に影響を与える可能性があります。

103
Brian
  • STDOUTはグローバル定数であるため、変更しないでください。
  • $stdoutは事前定義された変数なので、変更できます。

シェルを使用してリダイレクトを行う場合:

$ Ruby test.rb > test.log

スクリプトを実行する前にスクリプトのファイル記述子が決定されているため、どちらを使用するかは重要ではありません。

ただし、Rubyスクリプト内からOSのSTDOUTのファイル記述子を変更しようとしている場合、たとえば、現在の曜日に基づいてログファイルのローテーションセットに出力を送信する場合、[$stdout]を使用していることを確認する必要があります。

5
shakerlxxv

$stdoutSTDOUTの両方の意味は異なります。 Rubyのドキュメント は、このトピックではかなり明確です。

  • $stdout –現在の標準出力。
  • STDOUT –標準出力。 $ stdoutのデフォルト値。

標準出力に書き込む場合、実際にはcurrent標準出力を意味するため、$stdoutに書き込む必要があります。

STDOUTも無駄ではありません。 $stdoutのデフォルト値を保存します。 $stdoutを再割り当てした場合、$stdout = STDOUTを使用して以前の値に復元できます。

さらに、定義済みの変数がもう1つあります。

  • $> – print、printfのデフォルト出力。デフォルトでは$stdoutです。

ただし、Ruby 2.3のように見えますが、単に$stdoutのエイリアスとして動作します。$stdoutを再割り当てすると、$>の値が変更されます。

5
skalee