rust学习-打印结构体中的vec

write! 宏

将格式化后的数据写入到一个缓冲区(buffer),而不是直接打印到标准输出或文件中。
这个缓冲区可以是字符串,也可以是需要写入的文件的缓冲区。

write!(writer, format_string, expr1, expr2, ...);

writer 参数是一个实现了 std::io::Write trait 的对象,表示要将数据写入到哪里。

format_string 是一个格式化字符串,可以包含占位符 {},表示后面要插入的值。 expr1、expr2 等是值的表达式,可以是变量,常量,函数等。

write! 宏不会自动添加末尾的换行符。如果需要在写入缓冲区后添加换行符,可以在格式化字符串末尾添加 “\n”。

use std::io::Write;fn main() {let mut buffer = Vec::new(); // 创建一个空的缓冲区let n = 123;// 使用 write! 宏将格式化字符串 n = {}\n 写入到一个空的缓冲区 buffer 中// 使用 unwrap() 方法处理写入缓冲区时可能出现的错误write!(&mut buffer, "n = {}\n", n).unwrap();// 使用 String::from_utf8_lossy() 方法将缓冲区的内容转换为字符串格式,并进行输出println!("{}", String::from_utf8_lossy(&buffer));
}// 打印内容
// n = 123
// \n

write! 宏的返回值是一个 std::io::Result<()> 类型的值,表示写入操作是否成功。

  • 执行成功时,它返回一个包含 () 值的 Ok 枚举成员
  • 执行失败时,它会返回一个包含错误信息的 Err 枚举成员
use std::io::Write;fn main() {// 创建一个缓冲区let mut buffer = Vec::new();let n = 123;// 调用 write! 宏写入数据let result = write!(&mut buffer, "n = {}\n", n);if result.is_err() {// unwrap_err 只能在err的时候使用println!("Error: {}", result.unwrap_err());} else {println!("Write succeed.");println!("{:?}", buffer);}
}// 打印
// Write succeed.
// [110, 32, 61, 32, 49, 50, 51, 10]
  • 如果发现错误,使用 unwrap_err() 方法获取错误信息并进行输出
  • 如果没有出现错误,输出信息 “Write succeed.”。

打印结构体中的vec

use std::fmt; // 导入 `fmt` 模块。// 定义一个包含单个 `Vec` 的结构体 `List`。
struct List(Vec<i32>);impl fmt::Display for List {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {// 使用元组的下标获取值,并创建一个 `vec` 的引用// 创建一个指向结构体 List 中第一个元素的不可变引用// self 是一个 &List 类型的引用,它表示一个指向类型为 List 的结构体实例的引用// .0 表示取得 List 结构体中的第一个元素// 必须使用 &self.0 来获取 List 这个引用所指向的 Vec<i32> 实例let vec = &self.0;// ? 运算符,表示在发生错误时返回错误信息// 这样在上层函数中可以进行进一步的处理// ? 运算符只有在当前函数返回 Result 类型时才能使用write!(f, "[")?;// 使用 `v` 对 `vec` 进行迭代,并用 `count` 记录迭代次数。for (count, v) in vec.iter().enumerate() {// 对每个元素(第一个元素除外)加上逗号。// 使用 `?` 或 `try!` 来返回错误。if count != 0 { write!(f, ", ")?; }write!(f, "{}", v)?;}// 加上配对中括号,并返回一个 fmt::Result 值write!(f, "]")}
}fn main() {let v = List(vec![1, 2, 3]);println!("{}", v);
}

按照 k-v的形式打印

use std::fmt; // 导入 `fmt` 模块。// 定义一个包含单个 `Vec` 的结构体 `List`。
struct List(Vec<i32>);impl fmt::Display for List {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {// 使用元组的下标获取值,并创建一个 `vec` 的引用// 创建一个指向结构体 List 中第一个元素的不可变引用// self 是一个 &List 类型的引用,它表示一个指向类型为 List 的结构体实例的引用// .0 表示取得 List 结构体中的第一个元素// 必须使用 &self.0 来获取 List 这个引用所指向的 Vec<i32> 实例let vec = &self.0;// ? 运算符,表示在发生错误时返回错误信息// 这样在上层函数中可以进行进一步的处理// ? 运算符只有在当前函数返回 Result 类型时才能使用write!(f, "[")?;// 使用 `v` 对 `vec` 进行迭代,并用 `count` 记录迭代次数。for (count, v) in vec.iter().enumerate() {// 对每个元素(第一个元素除外)加上逗号。// 使用 `?` 或 `try!` 来返回错误。if count != 0 { write!(f, ", ")?; }write!(f, "{}: {}", count, v)?;}// 加上配对中括号,并返回一个 fmt::Result 值write!(f, "]")}
}fn main() {let v = List(vec![1, 2, 3]);println!("{}", v);
}

附录

unwrap 和 unwrap_err

  • unwrap() 方法用于从 Ok 枚举成员中取出存储的值,如果结果是 Err 枚举成员,则会引发 panic
  • unwrap_err() 方法用于从 Err 枚举成员中取出存储的错误信息,如果结果是 Ok 枚举成员,则会引发 panic。该方法主要用于在程序发生错误时对错误信息进行记录和处理,避免程序崩溃

display trait

对于 Vec 或其他任意泛型容器(generic container)
fmt::Display 都没有实现。因此在这些泛型的情况下要用 fmt::Debug。

use std::fmt; // 导入 `fmt`// 带有两个数字的结构体
// 推导出 `Debug`,以便与 `Display` 的输出进行比较
#[derive(Debug)]
struct MinMax(i64, i64);// 实现 `MinMax` 的 `Display`。
impl fmt::Display for MinMax {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {// 使用 `self.number` 来表示各个数据。write!(f, "({}, {})", self.0, self.1)}
}// 为了比较,定义一个含有具名字段的结构体
#[derive(Debug)]
struct Point2D {x: f64,y: f64,
}// 类似地对 `Point2D` 实现 `Display`
impl fmt::Display for Point2D {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {// 自定义格式,使得仅显示 `x` 和 `y` 的值。write!(f, "x: {}, y: {}", self.x, self.y)}
}fn main() {let minmax = MinMax(0, 14);println!("Compare structures:");println!("Display: {}", minmax);println!("Debug: {:?}", minmax);let big_range =   MinMax(-300, 300);let small_range = MinMax(-3, 3);println!("The big range is {big} and the small range is {small}", small = small_range, big = big_range);let point = Point2D { x: 3.3, y: 7.2 };println!("Compare points:");println!("Display: {}", point);println!("Debug: {:?}", point);// 报错。`Debug` 和 `Display` 都被实现了,但 `{:b}` 需要 `fmt::Binary`// 得到实现。这语句不能运行。// println!("What does Point2D look like in binary: {:b}?", point);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用POM完成脚本分离实现企业级自动化(POM设计模式+页面的框架封装+测试报告截图)

利用POM完成脚本分离实现企业级自动化&#xff08;POM设计模式页面的框架封装测试报告截图&#xff09; 项目-测试-手工测试 项目-测试-手工测试 1.了解需求&#xff1b; 2.编写测试用例&#xff08;开始&#xff09;——功能测试组会去做的事情 3.执行测试用例——发送测试报…

Mac 开发 Tang Nano FPGA 指南(使用终端和使用 VS Code 和插件,适用所有 Gowin FPGA)

最近收到了一个 Tang nano 9K FPGA开发板&#xff0c;就想借此机会研究一下。 官方文档里介绍如果想使用高云的 FPGA&#xff0c;就需要使用 GOWIN IDE&#xff0c;但是需要申请 license 提交一堆资料&#xff0c;我是别人送的就不太方便让别人弄。加上 IDE 其实并不是很适合学…

C#语音播报问题之 无法嵌入互操作类型SpVoiceClass,请改用适用的窗口

C#语音播报问题之 无法嵌入互操作类型SpVoiceClass&#xff0c;请改用适用的窗口 解决办法如下&#xff1a; 只需要将引入的Interop.SpeechLib的属性嵌入互操作类型改为false 改为false 即可解决&#xff01;

SpringCloud新人入门手册

一、SpringBoot流程图 二、创建一个单pom项目改为父子pom项目 0、检查idea是否在父模块pom中生成子模块 <modules><module>eureka</module></modules> 1、子模块pom.xml添加 <dependencies><dependency><groupId>org.springframew…

k8s ----POD控制器详解

目录 一&#xff1a;pod控制器 1、Pod控制器及其功用 2、pod控制器类型 3、Pod与控制器之间的关系 二&#xff1a;Deployment 三&#xff1a;SatefulSet 1、StatefulSet组成 2、为什么要有headless&#xff1f; 3、为什么要有volumeClaimTemplate&#xff1f; 4、实现…

golang云原生项目之:etcd服务注册与发现

服务注册与发现&#xff1a;ETCD 1直接调包 kitex-contrib&#xff1a; 上面有实现的案例&#xff0c;直接cv。下面是具体的理解 2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器&#xff0c;用于将域名转换为etcd集群中的具体地址&#xff0c;以便应用程序可以与et…

flutter-移动端适配

不同屏幕之间的尺寸适配 使用插件 flutter_screenutil flutter_screenutil flutter 屏幕适配方案&#xff0c;用于调整屏幕和字体大小的flutter插件&#xff0c;让你的UI在不同尺寸的屏幕上都能显示合理的布局! 安装 # add flutter_screenutil flutter_screenutil: ^5.8.4 o…

Servlet+JDBC实战开发书店项目讲解第9篇:VIP等级优惠实现

ServletJDBC实战开发书店项目讲解第9篇&#xff1a;VIP等级优惠实现 介绍 在这篇博客中&#xff0c;我们将讲解如何在书店项目中实现VIP等级优惠功能。VIP等级优惠是一种常见的商业策略&#xff0c;可以吸引更多的顾客并提高销售额。我们将使用Servlet和JDBC来实现这个功能。…

04_15页表缓存(TLB)和巨型页

前言 linux里面每个物理内存(RAM)页的一般大小都是4kb(32位就是4kb),为了使管理虚拟地址数变少 加快从虚拟地址到物理地址的映射 建议配值并使用HugePage巨型页特性 cpu和mmu和页表缓存(TLB)和cache和ram的关系 CPU看到的都是虚拟地址&#xff0c;需要经过MMU的转化&#xf…

ES的索引结构与算法解析

提到ES&#xff0c;大多数爱好者想到的都是搜索引擎&#xff0c;但是明确一点&#xff0c;ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎&#xff0c;还是有明确搜索目的的搜索行为&#xff0c;如各大…

ELKstack-Elasticsearch配置与使用

一. 部署前准备 最小化安装 Centos 7.x/Ubuntu x86_64 操作系统的虚拟机&#xff0c;vcpu 2&#xff0c;内存 4G 或更多&#xff0c; 操作系统盘 50G&#xff0c;主机名设置规则为 es-server-nodeX &#xff0c; 额外添加一块单独的数据磁盘 大小为 50G 并格式化挂载到/data/e…

VSCode快捷键

CtrlShiftP&#xff0c;F1&#xff1a;显示命令面板 CtrlP&#xff1a;快速打开 CtrlShiftN&#xff1a;新窗口/实例 CtrlShiftW&#xff1a;关闭窗口/实例 CtrlX&#xff1a;剪切行 CtrlC&#xff1a;复制行 ALT↑/↓&#xff1a;上下移动 ShiftAlt↓/↑&#xff1a;向…

音视频 ffmpeg命令分类查询

命令参数内容-version显示版本 -bsfs 显示可用比特流filter-buildconf显示编译配置-formats显示可用格式(muxersdemuxers)-muxers显示可用复用器-demuxers显示可用解复用器-codecs显示可用编解码器(decodersencoders)-decoders显示可用解码器-encoders显示可用编码器-bsfs显示可…

使用Scikit-Learn实现多标签分类,助力机器学习

大家好&#xff0c;在机器学习任务中&#xff0c;分类是一种监督学习方法&#xff0c;用于根据输入数据预测标签。例如&#xff0c;我们想要根据历史特征预测某人是否对销售优惠感兴趣&#xff0c;通过使用可用的训练数据训练机器学习模型&#xff0c;可以对输入数据执行分类任…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上

一、本章内容 本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 ![在这里插入图…

Python应用工具-Jupyter Notebook

工具简介 Jupyter Notebook是 基于 网页的用于交互计算的 应用程序&#xff0c;以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直接在代码块下 显示&#xff0c;文档是保存为后缀名为 . ipynb 的 JSON 格式文件。 操作指令…

使用Spring Initializr方式构建Spring Boot项目

除了可以使用Maven方式构建Spring Boot项目外&#xff0c;还可以通过Spring Initializr方式快速构建Spring Boot项目。从本质上说&#xff0c;Spring lnitializr是一个Web应用&#xff0c;它提供了一个基本的项目结构&#xff0c;能够帮助我们快速构建一个基础的Spring Boot项目…

【图论】最短路的传送问题

一.分层图问题&#xff08;单源传送&#xff09; &#xff08;1&#xff09;题目 P4568 [JLOI2011] 飞行路线 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) &#xff08;2&#xff09;思路 可知背景就是求最短路问题&#xff0c;但难点是可以使一条路距离缩短至0&#xf…

系统报错mfc100u.dll丢失的解决方法(完美解决dll问题)

系统文件mfc100u.dll丢失和出错&#xff0c;极有可能是盗号木马、流氓软件等恶意程序所导致&#xff0c;其感染相关文件并加载起来&#xff0c;一旦杀毒软件删除被感染的文件&#xff0c;就会导致相关组件缺失&#xff0c;游戏等常用软件运行不起来&#xff0c;且提示“无法启动…

通过爬虫抓取上市企业利润表并在睿思BI中展示

睿思BI从v5.3开始支持网络爬虫&#xff0c;可以从指定URL抓取表格数据&#xff0c;本示例实现从网络上抓取上市企业招商银行的利润表数据&#xff0c;并在睿思BI中进行展现。 首先&#xff1a;从搜狐财经抓取招商银行利润表数据&#xff0c;操作过程如下&#xff1a; 1.在睿思…