2016-09-13 6 views
2

std::io::BufReaderドキュメントを読んだ後に、どのように機能間でBufReaderを通すのが最適かわかりません。複数の順列は許されますが、どれが最適ですか?これを動作させることができますが関数間を渡すときにBufReader/BufWriterを参照するのはどのような意味ですか?

use std::fs::File; 
use std::io::BufReader; 
write_some_data(f: &mut std::fs::File) { 
    let mut reader = BufReader::new(f); 
    write_some_other_data(&mut reader); 
} 

、他の機能に周りの読者を渡すときに、参照アクセスの順列を使用する必要があります。

は、私は、ファイルを取る機能がありますか?

  • &mut BufReader<&mut File>
  • BufReader<&mut File>
  • &mut BufReader<File>
  • BufReader<File>

私はそれが&mut BufReader<&mut File>として渡すのがベストだろう考えていたデータを所有する各機能は必要ありませんので、しかし、ドキュメントの例では<File>を使用しています。

ここではどのような使い方をするのがよいでしょうか?

この例ではBufReaderを使用していますが、同じ回答がBufWriterにも適用されると仮定します。

答えて

8

最も慣用的な方法はおそらくstd::io::BufReaderを参照していない可能性があります。あなたは、実際の特性を参照したいReadおよび/またはBufRead

use std::io:BufRead; 

// Could also take by move if needed 
fn read_data<R: BufRead>(r: &mut R); 

機能は通常、本当にそれは同じ機能を持っているだけであること、読者は特にタイプstd::io::BufReaderであるかどうかを気にしません。

これにより、BufReader<File>,BufReader<&mut File>のいずれか、または必要な他のスペシャライゼーションのいずれかを自由に選択できます。 (ファイルでなくても、テストに役立つことはありません)

&mutと移動を使用するかどうかは、一般的にRustでは必要なものだけを要求することです。あなた(とあなたが呼び出す関数)は、不変の&参照のみを必要とする場合には、それを使用してください。もし変更が必要ならば& mutを使用してください。

Moveは、値によって何かを取る関数を使用する必要があるかどうかに基づいているだけでなく、関数がデータを「使い切る」ことを主張するために頻繁に使用されるため、何らかの形で。

BufReaderは、通常、参考文献ではなくFileをとり、高レベルの「このファイルを解析する」IO関数が値によって移動する傾向がある理由です。一般に、あるアダプターでファイルまたはリーダーの一部を消費し、残りを別のアダプターで消費する場合はありません。

実際、これは概念が非常に強く、リファレンスを提供するのではなく、ファイルを上位レベルのリーダーに移動し、into_innerのような関数を呼び出して、アダプタを切り替える必要があるときはいつでもファイルを取得する。

0

方法を見てみるとBufReaderの方法は、(&mut selfまたはselfに)呼び出され、私はあなたが通常の機能は、例えばためにBufReaderを所有する必要がある場合&mut BufReader、またはBufReaderを渡したいだろうと言うでしょうこれをBytesまたはCharsイテレータに変換します。

BufReader<File>と記載されているのはBufReader<&mut File>ではない理由は、BufReader owns its underlying Read instanceです。

関連する問題