4

Ruby-Docs では、次の例を示しています。

f1 = File.new("testfile")
f2 = File.new("testfile")
f2.readlines[0]   #=> "This is line one\n"
f2.reopen(f1)     #=> #<File:testfile>
f2.readlines[0]   #=> "This is line one\n"

私の質問は、なぜf2あなたができるのになぜ再開するのですか?新しいストリームを使用して再開する場合と、新しいストリームを使用する場合の利点はありますか?f2.closef1.readlines[0]

4

2 に答える 2

1

しばらく前に IRB で何人かの開発者と話しましたが、得られた応答は、主に$std変数を変更して、putsおよびprint出力先などのメソッドを変更するために使用されるというものでした...

$stdout.reopen(File.open('log'))
puts 'hello world'

ではなく、これを使用する理由は...

$stdout = File.open('log')

...ちょっと宙に浮いていましたが。Ruby の C 関数の一部では、直接代入がうまく機能しないという開発者が 1 人いました。私は C についてあまり知らないので、これについて多くを語ることはできませんが、彼は使用例を確認するための最小限のソースを教えてくれました。ただし、開発者が最後に確認してから、ソースでさえ直接割り当てと再開に切り替えたようです。

結論としては……見た目からしてIO#reopen無駄かもしれませんが、反論をいただきたいです。

アップデート

わかりましたので、ドキュメントを読み直したところ、次のオプションの 2 番目のセットがあることがわかりましたreopen

reopen(path, mode_str) → ios

これは、オプションとは対照的に、実際には多少便利に思えreopen(other_IO) → iosます。

于 2012-12-11T21:57:29.913 に答える