读完后std::io::BufReader https://doc.rust-lang.org/std/io/struct.BufReader.html文档,我不知道如何最好地通过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<&mut File>
BufReader<&mut File>
&mut BufReader<File>
BufReader<File>
由于不需要每个函数都拥有数据,我认为最好传递为&mut BufReader<&mut File>
,但文档中的示例使用<File>
.
在这里使用什么好的经验法则?
虽然这个例子使用BufReader
,我认为同样的答案也适用于BufWriter
too.
最惯用的方法可能是不引用std::io::BufReader
根本不。你实际上想参考特征Read
and/or 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 中,只请求你需要的东西是标准的。如果您(以及您调用的函数)只需要一个不可变的引用(&T
),使用它,如果您需要可变性,请使用&mut T
.
Move 更灵活一些,因为虽然它可以简单地根据是否需要使用按值获取某些内容的函数来使用,但它也经常用于断言该函数将以某种方式“用完”数据。
这就是为什么BufReader
通常需要一个File
而不是参考,以及为什么大多数高级“解析此文件”IO 函数倾向于按值移动。通常情况下,您不会消耗一部分File
或带有一个适配器的读卡器,其余的带有另一个适配器。
事实上,这在概念上是如此强大,以至于更常见的做法不是提供参考,而是直接移动File
进入更高级别的阅读器并调用类似的函数into_inner
每当您需要切换适配器时检索文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)