gpt4 book ai didi

io - 在函数之间传递时引用 BufReader/BufWriter 的惯用方法是什么?

转载 作者:行者123 更新时间:2023-11-29 07:45:04 27 4
gpt4 key购买 nike

看完 std::io::BufReader 文档,我不确定如何最好地传递 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也是。

最佳答案

最惯用的方式可能是不引用 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 中,只请求你需要的是标准的。如果您(以及您调用的函数)只需要一个不可变引用( &T ),请使用它,如果您需要可变性,请使用 &mut T .

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

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

事实上,这在概念上非常强大,与其提供引用,不如直接移动 File 更为常见。进入更高级别的阅读器并调用类似into_inner的函数在您需要切换适配器时检索文件。

关于io - 在函数之间传递时引用 BufReader/BufWriter 的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com