当前位置: 首页 > news >正文

Rust 格式化输出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、format! 宏
  • 二、fmt::Debug
  • 三、fmt::Display
  • 四、? 操作符 循环打印


前言

Rust学习系列-本文根据教程学习Rust的格式化输出,包括fmt::Debugfmt::Display等。


一、format! 宏

在 Rust 中,可以使用 format! 宏来进行格式化输出。这个宏类似于其他编程语言中的 printf 或者 sprintf 函数。

以下是一个简单的例子:

fn main() {let name = "Alice";let age = 25;let height = 165.5;let formatted = format!("Name: {}, Age: {}, Height: {:.2}", name, age, height);println!("{}", formatted);
}

这个例子中,我们使用了 format! 宏来创建一个格式化的字符串。在字符串中通过 {} 占位符来指定需要替换的值,并且可以使用 : 来指定格式化选项,比如使用 :.2 来保留小数点后两位。

然后我们使用 println! 宏来输出格式化后的字符串。

输出结果为:

Name: Alice, Age: 25, Height: 165.50

除了使用 format! 宏,还可以使用其他的格式化宏,比如 println!eprintln! 用于标准输出和标准错误输出。

二、fmt::Debug

rust fmt::Debug 是 Rust 标准库中的一个 trait,用于控制如何格式化数据类型的输出。它可以被任何实现了 std::fmt::Debug trait 的类型使用。

std::fmt::Debug trait 提供了一个 fmt 方法,该方法接受一个实现了 std::fmt::Debug trait 的数据类型,并将其格式化为一个字符串。可以使用 {} 占位符来表示要格式化的数据,并使用 :? 格式化符号来表示数据类型的 Debug 格式输出。

使用 std::fmt::Debug trait 的主要目的是为了调试目的,因为它提供了一个格式化的输出,可以使开发人员更容易地了解数据类型的内部结构和值。

下面是一个示例代码,展示了如何使用 std::fmt::Debug trait:

#[derive(Debug)]
struct Person {name: String,age: u32,
}fn main() {let person = Person {name: String::from("Alice"),age: 30,};println!("{:?}", person);// 美化输出println!("{:#?}",person);
}

在上面的示例中,Person 结构体实现了 std::fmt::Debug trait,并使用 #[derive(Debug)] 注解来自动实现它。在 main 函数中,我们创建了一个 Person 对象并使用 println! 宏来打印它。{:?} 是一个格式化占位符,它会调用 std::fmt::Debug trait 的 fmt 方法来打印 person 对象的 Debug 格式输出。

在这里插入图片描述

三、fmt::Display

在Rust中,fmt::Display是一个trait(特征),用于定义如何格式化类型的输出。该trait包含一个名为fmt的方法,它接受一个fmt::Formatter对象,并返回一个fmt::Result对象。

通过实现fmt::Display trait,你可以指定自定义类型的输出格式,以便在使用println!和format!宏时能够以预期的方式打印该类型的实例。例如:

use std::fmt;struct Point {x: i32,y: i32,
}impl fmt::Display for Point {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {write!(f, "({}, {})", self.x, self.y)}
}fn main() {let p = Point { x: 1, y: 2 };println!("The point is {}", p); // 输出:The point is (1, 2)
}

在上面的例子中,我们为自定义的Point类型实现了fmt::Display trait。在fmt方法中,我们使用write!宏向Formatter对象f写入格式化的内容。

通过这种方式,你可以根据自定义类型的属性和需求,定义自己的输出格式。

在这里插入图片描述

四、? 操作符 循环打印

对一个结构体实现 fmt::Display,其中的元素需要一个接一个地处理到,这可能会很麻烦。问题在于每个 write! 都要生成一个 fmt::Result。正确的实现需要处理所有的 Result。Rust 专门为解决这个问题提供了 ? 操作符。
在这里插入图片描述


http://www.lryc.cn/news/296967.html

相关文章:

  • c#进程(Process)常用方法
  • Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)
  • 一个设备内存2M,一个1G大小的文件,这个文件有若干行,输出其中的带有hello的行以及行数
  • json模块(高维数据的存储与读取)
  • ONLYOFFICE文档8.0新功能浅探
  • 在vscode 中配置 pyside6 环境
  • C语言:月份缩写
  • 线阵相机系列-- 1. 什么是线阵相机
  • CISCRISC? CPU架构有哪些? x86 ARM?
  • 【C语言】(15)指针进阶
  • 力扣精选算法100道—— 连续数组(前缀和专题)
  • flutter 国内源
  • 第九个知识点:内部对象
  • Android 车载应用开发之车载操作系统
  • Qt PCL学习(文章链接汇总)
  • 安卓动态链接库文件体积优化探索实践
  • [Java][算法 哈希]Day 01---LeetCode 热题 100---01~03
  • 【每日一题】LeetCode——链表的中间结点
  • k8s 部署java应用 基于ingress+jar包
  • 深度学习技巧应用36-深度学习模型训练中的超参数调优指南大全,总结相关问题与答案
  • “探索AJAX:前端与后端数据交互的利器“
  • 【5G NR】移动通讯中使用的信道编解码技术
  • 用Python Tkinter打造的精彩连连看小游戏【附源码】
  • nvm安装node后,npm无效
  • spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序
  • 5-2、S曲线计算【51单片机+L298N步进电机系列教程】
  • SQL 注入 - http头注入之UA头注入探测
  • 学习数据结构和算法的第5天
  • Android 11 访问 Android/data/或者getExternalCacheDir() root方式
  • Linux探秘之旅:透彻理解路径、命令与系统概念