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);
}
相关文章:
rust学习-打印结构体中的vec
write! 宏 将格式化后的数据写入到一个缓冲区(buffer),而不是直接打印到标准输出或文件中。 这个缓冲区可以是字符串,也可以是需要写入的文件的缓冲区。 write!(writer, format_string, expr1, expr2, ...);writer 参数是一个实…...
FPGA: RS译码仿真过程
FPGA: RS译码仿真过程 在上一篇中记录了在FPGA中利用RS编码IP核完成信道编码的仿真过程,这篇记录利用译码IP核进行RS解码的仿真过程,带有程序和结果。 1. 开始准备 在进行解码的过程时,同时利用上一篇中的MATLAB仿真程序和编码过程&#x…...
PostgreSQL 查询数据表、视图信息
--获得指定schema范围内的所有表和视图的列表,可指定一个排除表前缀模式with param as (select public,iit as schema_name,db2g% as exclude_pattern),base_info as (--获得所有基表select pg_namespace.nspname as schema_name, a.relname as tbl_name ,TBL as tb…...
手撕vector容器
一、vector容器的介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素,但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 总结:vector是一个动态…...
PyMuPDF`库实现PDF旋转功能
本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。主要用于csdn网站中导出的博客pdf是横向的,看起来不是很方便,才想到用python编制一个将pdf从横向转为纵向的功能。 功能 该PDF转换工具具有以下功能:…...
微人事 登录问题完善
重启服务端的时候,发现前端页面会操作不了,这样后端session会失效,我们就需要让页面重新跳转到登录页 springsecurity配置类后端配置 前端拦截器进行拦截跳转...
【业务功能篇64】安装docker容器,在docker上安装mysql
docker教程: https://www.runoob.com/docker/docker-tutorial.html卸载docker 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 yum remove docker docker-client docker-client-latest docker-co…...
MyBatis的基本概念和核心组件
MyBatis的基本概念 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Pla…...
sql update执行返回0,能否判断数据不存在
答案:不能。 update执行返回0的情况 1、没有找到需要更新的数据,就是这条记录不存在 例如:where后面的条件是id0,那这条记录肯定是不存在的,返回结果是0 2、更新时的数据和要更新的数据完全一致时 例如:更…...
数据分析 | 调用Optuna库实现基于TPE的贝叶斯优化 | 以随机森林回归为例
1. Optuna库的优势 对比bayes_opt和hyperoptOptuna不仅可以衔接到PyTorch等深度学习框架上,还可以与sklearn-optimize结合使用,这也是我最喜欢的地方,Optuna因此特性可以被使用于各种各样的优化场景。 2. 导入必要的库及加载数据 用的是sklea…...
stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)
说明:这个buzzer的额定电压需要改为3V,否则不会叫,源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…...
打印X型的图案
int main() {int n0;int i0;int j0;scanf("%d",&n);for(i0;i<n;i){for(j0;j<n;j){if(ij){printf("*");}else if((ij)n-1){printf("*");}elseprintf(" ");}printf("\n");}return 0; }...
不含数字的webshell绕过
异或操作原理 1.首先我们得了解一下异或操作的原理 在php中,异或操作是两个二进制数相同时,异或(相同)为0,不同为1 举个例子 A的ASCII值是65,对应的二进制值是0100 0001 的ASCII值是96,对应的二进制值是 0110 000…...
Mac上传项目源代码到GitHub的修改更新
Mac上传项目源代码到GitHub的修改更新 最近在学习把代码上传到github,不得不说,真的还挺方便 这是一个关于怎样更新项目代码的教程。 首先,在本地终端命令行打开至项目文件下第一步:查看当前的git仓库状态,可以使用git…...
Android6:片段和导航
创建项目Secret Message strings.xml <resources><string name"app_name">Secret Message</string><string name"welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Star…...
ClickHouse AST is too big 报错问题处理记录
ClickHouse AST is too big 报错问题处理记录 问题描述问题分析解决方案1、修改系统配置2、修改业务逻辑 问题描述 项目中统计报表的查询出现 AST is too big 问题,报错信息如下: 问题分析 报错信息显示 AST is too big。 AST 表示查询语法树中的最大…...
DPDK系列之二十七DIDO
一、DIDO介绍 随着计算机技术发展,特别是应用技术的快速发展。应用场景对计算机的处理速度几乎已经到了疯狂的地步。说句大白话,再快的CPU也嫌慢。没办法,CPU和IO等技术基本目前都处在了瓶颈之处,大幅度提高,短时间内…...
《游戏编程模式》学习笔记(七)状态模式 State Pattern
状态模式的定义 允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器,实现跳跃功能 直觉上来说,我们代码会这么写: void Heroine::handleInput(Input input…...
博客系统之功能测试
博客系统共有:用户登录功能、发布博客功能、查看文章详情功能、查看文章列表功能、删除文章功能、退出功能 1.登录功能: 1.1测试对象:用户登录 1.2测试用例 方法:判定表 用例 编号 操作步骤预期结果实际结果截图1 1.用户名正确…...
CJS和 ES6 的语法区别
CommonJS 使用 module.exports 导出模块。ES6 使用 export 导出模块。 示例代码: CommonJS(CJS)模块的导出: // 导出模块 module.exports {foo: bar,baz: function() {return qux;} }; ES6 模块的导出: // 导出模…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
