Rust 格式化输出占位符详解

文章目录

Rust 的格式化输出由 std::fmt 模块提供,核心是 format!、 println!、 print!、 eprintln! 等宏。它们的占位符是 {},通过 格式说明符 控制输出样式。

1.基本占位符

占位符 说明 示例
{} 默认格式,按类型的 Display trait 输出 println!("{}", 42) → 42
{:?} Debug 格式,按 Debug trait 输出 println!("{:?}", vec![1,2]) → [1, 2]
{:#?} 美化 Debug 格式,多行缩进 常用于结构体调试
{:#x} 带前缀的十六进制 println!("{:#x}", 255) → 0xff
{:#b} 带前缀的二进制 println!("{:#b}", 5) → 0b101

2.格式说明符完整语法

复制代码
{:[[填充]对齐][符号][#][0][宽度][.精度][类型]}
部分 说明 示例
填充 填充字符,默认空格 {:->10} → --------42
对齐 < 左对齐,^ 居中,> 右对齐 {:<10}、{:^10}、{:>10}
符号 + 强制显示正号,- 默认 {:+} → +42
# 显示前缀(0x、0b) {:#x} → 0xff
0 用 0 填充 {:05} → 00042
宽度 最小宽度 {:8} → 42
精度 浮点小数位数,或字符串最大长度 {:.2} → 3.14
类型 输出进制或格式 x、X、b、o、e、?

3.常用示例

1. 整数进制

rust 复制代码
println!("{}", 255);    // 255(十进制)
println!("{:x}", 255);  // ff(小写十六进制)
println!("{:X}", 255);  // FF(大写十六进制)
println!("{:b}", 5);    // 101(二进制)
println!("{:o}", 8);    // 10(八进制)
println!("{:#x}", 255); // 0xff(带前缀)

2. 浮点数

rust 复制代码
println!("{}", 3.14159);    // 3.14159
println!("{:.2}", 3.14159); // 3.14(保留 2 位小数)
println!("{:e}", 31415.9);  // 3.14159e4(科学计数法)

3. 宽度与对齐

rust 复制代码
println!("{:>10}", 42);   // "        42"(右对齐)
println!("{:<10}", 42);   // "42        "(左对齐)
println!("{:^10}", 42);   // "    42    "(居中)
println!("{:05}", 42);    // "00042"(零填充)
println!("{:->10}", 42);  // "--------42"(自定义填充)

4. 位置参数与命名参数

rust 复制代码
// 位置参数:按顺序引用
println!("{0} {1} {0}", "a", "b"); // a b a

// 命名参数:按名称引用
println!("{name} 今年 {age} 岁", name = "Alice", age = 30);

// 捕获外部变量(Rust 2021+)
let x = 42;
println!("{x}"); // 直接使用变量名

5. Debug 格式

rust 复制代码
#[derive(Debug)]
struct Point { x: i32, y: i32 }

let p = Point { x: 1, y: 2 };
println!("{:?}", p);   // Point { x: 1, y: 2 }
println!("{:#?}", p);  // 多行美化格式

4.注意事项

注意点 说明
{} 需要 Display trait 自定义类型默认没有 Display,需手动实现或用 {:?}
{:?} 需要 Debug trait 用 #[derive(Debug)] 自动派生
精度对字符串的影响 {:.3} 对字符串表示截取前 3 个字符
宽度是最小值 实际内容超过宽度时不会被截断

5.一句话总结

Rust 格式化占位符 {} 通过 {:[[填充]对齐][符号][#][0][宽度][.精度][类型]} 控制输出,支持 Display、Debug、进制转换、对齐、填充、精度等,是 Rust 中最常用的输出工具。

相关推荐
对象存储与RustFS6 小时前
HelixDB 上手:Agent 记忆新方案,基于 RustFS 对象存储,附完整 docker-compose 部署示例
后端·rust·开源
Amos_Web6 小时前
Rspack 源码解析(二十):Typed Hook 系统如何靠宏生成
前端·rust·前端框架
Source.Liu7 小时前
【A11】拆分前端,实现多页面方案
前端·rust
Kapaseker8 小时前
别只会 unwrap():Rust Result 的几种实用写法
rust
DongQiShanRen19 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
编程序的员20 小时前
使用OpenTelemetry来监控Rust应用
运维·rust·monitoring·opentelemetry
对象存储与RustFS1 天前
JuiceFS + 对象存储:把 S3 变成 POSIX 文件系统实测
后端·rust·开源
遇码1 天前
侧边栏一开,AI 画的东西就被挡住了:给白板画布加「真实可见区」计算和相机补偿
人工智能·ai·rust
geovindu1 天前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
轻舟技术A2 天前
Pi 的 Rust 实现来了:rpi,不止一个终端 Agent
开发语言·后端·rust