3

Ruby には stdio 用の定数とグローバル変数があります。

つまり、 const STDINSTDOUTSTDERR、およびそれらに対応する変数$stdin$stdout$stderr

定数と変数の違いを理解しています。スクリプトが実行された時点で、定数がファイル記述子に不変に設定されていることはわかっています。

また、実行時に変数 (の一部) を変更できることも理解しています。

このような機能の実用化に興味があります。なぜあなたはそれをしたいのですか?あなたは何を達成できますか?

実世界のプロジェクトから抽出されたサンプル コード、またはユース ケースを見るだけでも素晴らしいでしょう。


更新:これまでに収集したことから、独自のライブラリ/プログラムを作成するときは、ユーザーがさらにいじることができるように、定数よりも変数を使用することを好むようです。右?

4

4 に答える 4

3

この関数のより精巧なバージョンは、製品コードで使用されています。

#!/usr/bin/env ruby -rstringio

def capture_stdout
  $stdout = StringIO.new
  begin
    yield
    $stdout.string
  ensure
    $stdout = STDOUT
  end
end

output = capture_stdout do
  print "Line"
  puts " 1"
end

p output     # => "Line 1\n"

printまたはを使用してコンソールに何が書き込まれたかを知りたい単体テストで使用されputsます。

変数を使用$すると、Ruby に stdout、stdin、stderr の異なる IO オブジェクトを与えることができます。

$stdout = buffer

$定数を使用すると、変数を元の (プログラムが開始されたときの) 値に簡単に戻すことができます。

$stdout = STDOUT
于 2010-01-01T20:03:24.180 に答える
2

松本さんの本に答えがあるようです。9.7.1.4定義済みストリームからの引用: 「グローバル関数は、デフォルトで $stdout と同様printputs書き込みます。スクリプトがこのグローバル変数の値を変更すると、それらのメソッドの動作が変更されます。」

実装が不十分な可能性のあるプログラムを簡単に解決できるようにすることが目的のように思えます。

于 2010-01-01T19:45:24.610 に答える
1
$stderr = File.open 'error.log', 'w'

すべてのエラーは error.log に書き込まれます

于 2010-01-01T19:48:47.907 に答える
0

出力の一部をファイルに送信し、完了したらコンソールにダンプすることができます。

于 2010-01-01T19:30:24.077 に答える