在 Rust 开发中,格式化输出是调试、日志打印、字符串构造的核心技能。Rust 提供了一套强大且灵活的输出宏体系,支持普通打印、调试输出、自定义格式、精度控制、对齐填充等几乎所有场景。
本文结合完整知识点,为你总结 Rust 中所有输出方式 + 格式化语法,通俗易懂、全是干货,看完就能直接用在项目里。
一、Rust 五大输出宏(必背)
Rust 提供 5 个核心输出宏,分工明确:
| 宏 | 作用 | 输出目标 | 换行 |
|---|---|---|---|
print! | 格式化输出文本 | 标准输出 (stdout) | ❌ |
println! | 格式化输出文本 + 自动换行 | 标准输出 | ✅ |
format! | 生成格式化字符串(不打印,返回 String) | 内存字符串 | — |
eprint! | 错误信息输出 | 标准错误 (stderr) | ❌ |
eprintln! | 错误信息输出 + 自动换行 | 标准错误 | ✅ |
简单示例
fnmain(){// 打印不换行print!("Hello ");// 打印并换行println!("World!");// 生成格式化字符串(最常用!)lets=format!("{} + {}",1,2);println!("{s}");// 错误输出(用于日志、报错)eprintln!("错误:文件打开失败");}二、两种核心占位符:{} 与 {:?}
Rust 抛弃了 C 语言的%d/%s,只用两种占位符搞定一切:
1.{}—— 面向用户的友好输出
- 实现
std::fmt::Display特征 - 用于最终用户展示
- 字符串、数字默认支持
- 结构体不能直接用,需手动实现
Display
println!("{}",123);println!("{}","hello");2.{:?}—— 面向调试的输出
- 实现
std::fmt::Debug特征 - 用于开发调试
- 绝大多数类型可直接用(数组、Vec、枚举等)
- 结构体只需
#[derive(Debug)]
#[derive(Debug)]structUser{name:String}println!("{:?}",User{name:"Zhang".into()});3.{:#?}—— 美化调试输出(自动换行 + 缩进)
println!("{:#?}",vec![1,2,3]);输出结构清晰,适合复杂数据调试。
三、自定义类型如何输出?(高频面试 / 开发)
1. 调试用:给结构体加#[derive(Debug)]
最简单,90% 场景够用。
2. 展示用:手动实现Display特征
usestd::fmt;structPerson{name:String,age:u8}implfmt::DisplayforPerson{fnfmt(&self,f:&mutfmt::Formatter)->fmt::Result{write!(f,"姓名:{},年龄:{}",self.name,self.age)}}// 使用:{}println!("{}",Person{name:"张三".into(),age:18});3. 外部类型无法直接实现 Display?用 Newtype 包装
structArray(Vec<i32>);implfmt::DisplayforArray{fnfmt(&self,f:&mutfmt::Formatter)->fmt::Result{write!(f,"数组:{:?}",self.0)}}四、高级格式化语法(万能格式手册)
1. 位置参数
println!("{1} {0}","a","b");// 输出 b a2. 具名参数
println!("{name}",name="张三");3. Rust 1.58+ 直接捕获环境变量(超级好用)
letname="张三";println!("{name}");// 直接用变量名!五、宽度、对齐、填充(格式化表格必备)
左对齐</ 右对齐>/ 居中^
println!("{:<5}","x");// 左对齐:x____println!("{:>5}","x");// 右对齐:____xprintln!("{:^5}","x");// 居中:__x__指定填充字符
println!("{:-<5}","x");// x----数字补 0
println!("{:05}",42);// 00042六、精度控制
浮点数保留小数
println!("{:.2}",3.14159);// 3.14字符串截取长度
println!("{:.3}","hello");// hel七、进制输出(调试神器)
println!("{:#b}",27);// 二进制 0b11011println!("{:#o}",27);// 八进制 0o33println!("{:#x}",27);// 小写十六进制 0x1bprintln!("{:#X}",27);// 大写十六进制 0x1B八、指针地址输出
letv=vec![1,2,3];println!("{:p}",v.as_ptr());// 输出内存地址九、转义输出
想打印{和}:
println!("{{}}");// 输出 {}println!("\"Hello\"");// 输出 "Hello"十、一张图记住 Rust 输出体系
标准输出:print! / println! 错误输出:eprint! / eprintln! 字符串生成:format! 占位符: {} = Display(用户展示) {:?} = Debug (调试) {:#?} = 美化调试 格式控制: 对齐:< > ^ 填充:0 或自定义符号 精度:.2 .4 进制:b o x X总结(最核心 4 条)
- 日常打印用
println!,构造字符串用format! - 给用户看用
{},调试用{:?} - 复杂结构体必须加
#[derive(Debug)] - Rust 1.58+ 可直接
println!("{var}")