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

2024-01-08

读完后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(使用前将#替换为@)

在函数之间传递 BufReader/BufWriter 时,引用 BufReader/BufWriter 的惯用方法是什么? 的相关文章

随机推荐

  • Win 2008 r2 x64 服务器是否已安装 .net 3 sp1 软件包?

    和标题一样吗 我有一个带有上述操作系统的测试服务器 我的应用程序基于 net 3 5 我确实想知道 win 2008 r2 是否附带 net 3 5 的 Service Pack 1 它是否附带 net 3 5 sp1 系列更新 因为我下载
  • 我无法在操作创建者文件中使用 useHistory 函数

    我正在使用react router dom和redux 我在调度后使用history push 但它显 示错误 我希望用户在成功身份验证后导航到 使用谷歌 export const googleLogin gt async dispatch
  • 地址上方首次使用的单元格

    我正在 Excel 中创建预算 因此我有一些类别和子类别 子类别与其各自的父类别相比有 1 个单元格 子类别当然可以有自己的子类别 在 类别树 旁边的列中 我想打印 类别路径 Let s say I have the following t
  • 如何使用node.js生成excel文件?

    您好 我正在从数组中生成 excel 文件 但我没有成功 我正在使用 node js 工作 并且使用 npm 包生成 excel 文件 但我没有在 excel 文件中获取任何数据 excel 已生成 但未在我的文件中获取任何类型的数据 所以
  • 当 RStudio 中的 ioslides 的 type=HTML 时,调整 stargarzer 表的大小

    我刚开始使用 R Markdown 在 RStudio 中创建幻灯片演示文稿 我无法在网上找到任何可以解决我的具体问题的内容 这是close https stackoverflow com questions 15385696 how to
  • v8 中 Node.js 和 chrome 之间的区别

    镀铬版本 49 0 2623 110 m 节点 v5 10 0 这是我的代码 var a 0 function this a 1 this b 2 console log a console log a console log b 铬给出
  • dplyr 和 tidyr:将长格式转换为宽格式并排列列

    我正在创建一个shiny app用户将在其中上传包含多个变量的 csv 文件 使用dplyr 我会select前四个变量 如下所示 并将它们从长格式转换 DATA df lt read table text c Customer Rate
  • 更改绘图悬停框 R 的位置

    我想更改悬停框的位置plotly条形图 我希望它在栏上方弹出 而不是在左侧或右侧弹出 这可能吗 我一直在谷歌上搜索这个并盯着 Plotly R 参考页面几个小时 但没有运气 这是一个示例 library dplyr library plot
  • 在Oracle中使用SQL从3个表中选择数据

    我希望有人可以提供帮助 我是very这一切都是新的 我被困住了 我有 3 个表 我试图从中提取数据 顾客 custid 第一个 最后一个 积分俱乐部编号 调查编号 订单日期 订单总数 员工 empid 名字 姓氏 工资 销售额 销售日期 c
  • 简单的 REST URL 方案

    在我的网络应用程序中 我有一个user模型和一个journal and post模型 每个用户可以有多个日记 每个日记可以有多个帖子 下面是以 RESTful 方式表示这一点的最佳方式吗 profiles
  • EntityFramework Core 1.1.0 缺少 Include()? [复制]

    这个问题在这里已经有答案了 我正在使用 EntityFramework Core 1 1 0 我可以查询表并加载实体 但 Microsoft 的说明表明如果我想加载关系数据 我应该使用 Include 功能 https learn micr
  • php cURL 问题

  • 避免使用“抛出”构造函数进行堆分配

    说我有课Foo它没有定义默认构造函数并且throws在非默认构造函数中 初始化该类型的新对象时 我想捕获任何异常并返回 否则继续使用该对象 我注意到初始化这个对象 如果可能的话 很困难在堆栈上或通过使用共享指针 因为我试图避免管理内存 Fa
  • NuGet如何决定是否使用本地包缓存?

    今天 我在安装软件包时遇到了 NuGet 的奇怪行为 简要描述 作为我的构建脚本的结果 有一个 NuGet 包 我不会每次都更改版本 因此每个构建都会产生MyPackage 1 0 0 nupkg 作为构建的最后一步 我将包推送到部署在本地
  • mongodb按子字段查询

    如何查询全部 module B 以下查询不起作用 db XXX find id module B 万分感谢 数据如下 id module A date ISODate 2013 03 18T07 00 00Z value count 1 0
  • 如何在 Coq 中禁用我的自定义符号?

    我定义了一个符号来模拟命令式编程 Notation a gt gt b b a at level 50 然而之后 所有函数应用表达式都表示为 gt gt 样式 例如 在 Coq Toplevel 的证明模式下 我可以看到 bs nat gt
  • asp.net mvc 5实体框架6身份与信任级别=中等?

    创建最简单的项目 在 Visual Studio 2013 gt asp net Web 应用程序 gt 使用个人帐户进行 MVC 身份验证 它在本地主机上完美运行 但是 当发送到服务器 中等信任级别 时 当我尝试输入登录名时 该项目无法运
  • Nhibernate 错误:System.Data.SqlClient.SqlException:“索引”附近的语法不正确

    我有一个 nhibernate 解决方案 我正在尝试保存 但出现此错误 Test method HelloMusic Core Test CrudTests TestTrackAdd threw exception NHibernate E
  • Android 清单.xml

    我正在研究 Google Android 开发者网站 http developer android com resources tutorials views hello tabwidget html 中的选项卡示例 但我陷入了步骤 2 在
  • 在函数之间传递 BufReader/BufWriter 时,引用 BufReader/BufWriter 的惯用方法是什么?

    读完后std io BufReader https doc rust lang org std io struct BufReader html文档 我不知道如何最好地通过BufReader函数之间 允许多种排列 但哪种排列最好 我有一个需