Rubyでは、IOストリームの再割り当てとIO#reopen
メソッドの使用の違いは何ですか?換言すれば、どのようなRuby IOストリームでの再割り当てと再オープンの違い
$stdout = newfile
との間の差である:
$stdout.reopen(newfile)
Rubyでは、IOストリームの再割り当てとIO#reopen
メソッドの使用の違いは何ですか?換言すれば、どのようなRuby IOストリームでの再割り当てと再オープンの違い
$stdout = newfile
との間の差である:
$stdout.reopen(newfile)
を
$stdout.write("Buffered")
$stdout = $stderr
$stdout.write("After assignment")
と
$stdout.write("Buffered")
$stdout.reopen($stderr)
$stdout.write("After reopen")
をしたがって、基本的となり仲間$stdout
を再開newfile
ストリーム=>$stdout
およびnewfile
は、同じストリームに関連付けられた2つのFileインスタンスになります。
=
は、実際には同じファイルのインスタンスを指す2つの変数になります$stdout
=>$stdout
とnewfile
にnewfile
Fileインスタンスを割り当てます。
帰結:
reopen
インスタンス上の任意の変化(すなわち、ストリーム自体に影響を与えない)を使用して、他のインスタンスには反映されません。
=
例:
a = File.new('name')
b = File.new('name')
a.lineno #=> 0
b.lineno #=> 0
a.lineno = 3
a.lineno #=> 3
b.lineno #=> 0
b = a
a.lineno #=> 3
b.lineno #=> 3
a.lineno = 0
a.lineno #=> 0
b.lineno #=> 0
reopen
例:あなたは子プロセスを実行しているとき
a = File.new('name')
b = File.new('name')
a.lineno #=> 0
b.lineno #=> 0
a.lineno = 3
a.lineno #=> 3
b.lineno #=> 0
b.reopen(a)
a.lineno #=> 3
b.lineno #=> 3
a.lineno = 0
a.lineno #=> 0
b.lineno #=> 3
前IOするフラッシュと私は信じ後者(reopen
)場合に閉じられます。
を追加しました:の出力の比較:(比較するための最良の方法は、パイプを使用して出力をリダイレクトすることである)
差が重要です。
割り当て:
$stdout = File.open("/dev/null", "w")
system "ls"
warn $stdout.fileno # file descriptor number
出力 - system
の出力はまだ登場どのように気づく:
1.txt 2.txt
7
再オープン: - 番目
$stdout.reopen("/dev/null")
system "ls"
warn $stdout.fileno
出力をsystem
出力eは/dev/null
に送信されました:
1
概要:$stdout
、$stdin
、または$stderr
の
再割り当ては、現在のルビープロセスに影響を与えます。子プロセスは、独自の標準出力をファイル記述子(FD)1に書き込み、FD 0から標準入力を読み込み、FD 2に診断出力を書き出します。
変更を継承するには、再オープンする必要がありますそのストリームは、ファイル記述子を再利用するためです。あなたが子供を始めての前にreopen
の場合、子供にのみ影響があることに注意してください。
1つの使用例:デーモンスクリプト(またはログアウトしても実行し続ける必要のある他のスクリプト)を作成しています。ベストプラクティスは、3つの標準ストリームをすべて/dev/null
に再度開くことです。そうしないと、スクリプトまたは子プロセスがストリームを使用しようとするとパイプが壊れる可能性があります。
「sync」オプションは、これら2つのストリームリダイレクト方法とどのように機能しますか? – jrdioko
@jrdioko 'sync'は' File'インスタンスを介してwriteメソッドを呼び出すたびにファイルに書き込みます。両方とも、 'reopen'と' = 'は' sync'値をターゲット 'File'インスタンスに"コピー "します。ポイントへ行く: '='を使うと、両方の変数で同じ 'File'を扱うので、両方のいずれかに書き込むたびにストリームポインタが更新されます。 'reopen'を使うと、もう一方の位置を変更せずにそれらのうちの1つに書き込むことができます。そうすれば、もう一方に書き込むと、前の内容を上書きしてしまいます。 – robertodecurnex