Io 在函数之间传递BufReader/BufWriter时,引用它的惯用方式是什么?

Io 在函数之间传递BufReader/BufWriter时,引用它的惯用方式是什么?,io,rust,Io,Rust,阅读文档后,我不确定如何在函数之间传递BufReader。允许多重排列,但哪一种最好 我有一个接受文件的函数: use std::{fs::File, io::BufReader}; fn read_some_data(f: &mut std::fs::File) { let mut reader = BufReader::new(f); read_some_other_data(&mut reader); } 虽然这可以实现,但在将读取器传递给其他函数时,应

阅读文档后,我不确定如何在函数之间传递
BufReader
。允许多重排列,但哪一种最好

我有一个接受文件的函数:

use std::{fs::File, io::BufReader};

fn read_some_data(f: &mut std::fs::File) {
    let mut reader = BufReader::new(f);
    read_some_other_data(&mut reader);
}
虽然这可以实现,但在将读取器传递给其他函数时,应该使用哪种引用访问排列

  • &mut BufReader
  • BufReader
  • &mut BufReader
  • BufReader
由于不需要每个函数都拥有数据,我一直认为最好以
&mut BufReader
的形式传递,但文档中的示例使用

这里有什么好的经验法则


虽然这个例子使用了
BufReader
,但我认为同样的答案也适用于
BufWriter

看看
BufReader
的方法被调用的方式(在
&mut self
self
),我想说你通常会想传递
&mut BufReader
,或
BufReader
如果函数需要拥有
BufReader
以便将其转换为
字节
字符
迭代器


文档描述
BufReader
而不是
BufReader
的原因是,

最惯用的方式可能是根本不引用
std::io::BufReader
。实际上,您希望引用traits
Read
和/或
BufRead

use std::io:BufRead;

// Could also take by move if needed
fn read_data<R: BufRead>(r: &mut R);
使用std::io:BufRead;
//如果需要,也可以采取行动
fn读取数据(r:&mut r);
该函数通常并不真正关心读卡器是否是特定类型的
std::io::BufReader
,只是它具有相同的功能

这也让您完全可以自由选择
BufReader
BufReader
或您需要的其他专业。(它甚至不必是文件,这有助于测试!)

至于是否使用
&mut
而不是移动,一般来说,标准是只请求您需要的东西。如果您(以及您调用的函数)只需要不可变引用(
&T
),请使用该引用;如果您需要可变性,请使用
&mut T

Move更灵活一些,因为虽然它可以简单地根据是否需要使用按值获取某些内容的函数来使用,但它也经常用于断言函数将以某种方式“用完”数据

这就是为什么
BufReader
通常使用
文件而不是引用,以及为什么大多数高级“parse This File”IO函数倾向于按值移动。通常情况下,您不会使用一个适配器使用
文件的一部分或读取器,而使用另一个适配器使用其余部分


事实上,这在概念上是如此强大,以至于在需要切换适配器时,通常只需将
文件
移动到更高级别的读取器中,并调用
这样的函数进入内部
来检索文件。

我是个新手,但不会读取数据(r:&mut r)是更好的解决方案吗?@PhilipRidout这完全取决于您是否使用
BufRead
方法。像
split
lines
这样的方法非常常见。