Rubyでは、$stdout
(前にドル記号が付いている)とSTDOUT
(すべて大文字の)の違いは何ですか?出力のリダイレクトを行う場合、どちらを使用する必要がありますか。それはなぜですか。同じことがのために行く$stderr
とSTDERR
。
編集:関連する質問が見つかりました。
回答:
$stdout
あるグローバル変数の現在の標準出力を表しています。 標準出力を表す定数STDOUT
で、通常はのデフォルト値です。$stdout
でSTDOUT
一定である、あなたは、しかし、あなたは再定義することができ、それを再定義するべきではありません$stdout
、エラー/警告(再定義することなく、STDOUT
警告を発生させます)。たとえば、次のことができます。
$stdout = STDERR
同じことがのために行く$stderr
と、STDERR
したがって、質問の他の部分に答えるには、定数ではなく、グローバル変数を使用して出力をリダイレクトします。コードでさらに変更するように注意してください。グローバル変数を再定義すると、アプリケーションの他の部分に影響を与える可能性があります。
$>
は、デフォルトの出力ストリームではなく、を使用する必要があります$stdout
。
IO#reopen
した方が良いと思います$stdout
か?私はこの意見に全く同意しません。$stdout.reopen
メソッドの変異し、その受信機およびそれにも影響しますSTDOUT
、あなたが再割り当てされていない場合$stdout
の前に。それらは同義語であることを意味するものではなく、割り当てのためにそれらが異なる値を保持する場合、それはSTDOUT
あなたがそれを再オープンすることによってその目的を壊していることは悪いことではありません。
STDOUT
グローバル定数なので、変更しないでください。 $stdout
は事前定義された変数なので、変更できます。シェルを使用してリダイレクトを行う場合:
$ ruby test.rb > test.log
スクリプトを実行する前に、スクリプトのファイル記述子としてどちらを使用するかを決定する必要はありません。
ただし、Rubyスクリプト内からOSのSTDOUTのファイル記述子を変更しようとしている場合、たとえば、現在の曜日に基づいてログファイルのローテーションセットに出力を送信する場合は、確認する必要があります。あなたが使用します$stdout
。
STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>
両方$stdout
とSTDOUT
異なる意味を持っています。 Rubyのドキュメントは、このトピックについてはかなり明確です。
$stdout
–現在の標準出力。STDOUT
–標準出力。$ stdoutのデフォルト値。
標準出力に書き込む場合は、実際には現在の標準出力を意味するため、に書き込む必要があります$stdout
。
STDOUT
も無駄ではありません。のデフォルト値を格納します$stdout
。を再割り当てする場合$stdout
は、を使用して以前の値に復元できます$stdout = STDOUT
。
さらに、もう1つ事前定義された変数があります。
$>
–印刷のデフォルト出力であるprintf。これは$stdout
デフォルトです。
ただし、Ruby 2.3では、単にのエイリアスとして動作するように見え$stdout
ます。再割り当て$stdout
すると、の値が変更され、$>
逆も同様です。