Appearance
1.5 Format 格式详细说明
在后面的内容中,我们还会大量使用println!
宏,因此提前介绍一下这个宏的基本用法。跟 C 语言的 printf 函数类似,这个宏也支持各种格式控制,示例如下:
rust
fn main() {
let n = 1;
let test = "test";
println!("{}", n); // 默认用法,打印 Display
println!("{:o}", 9); // 八进制
println!("{:x}", 255); // 十六进制 小写
println!("{:X}", 255); // 十六进制 大写
println!("{:p}", &test); // 指针
println!("{:b}", 15); // 二进制
println!("{:e}", 10000f32); // 科学计数 (小写)
println!("{:E}", 10000f32); // 科学计数 (大写)
println!("{:?}", test); // 打印 Debug
println!("{:#?}", ("test1", "test2")); // 带换行和缩进的 Debug 打印
println!("{a} {b} {b}", a = "x", b = "y"); // 命名参数
}
当参数不受println!
支持时,编译器会提示当前受支持的一些参数:
sh
= note: the only appropriate formatting traits are:
- ``, which uses the `Display` trait
- `?`, which uses the `Debug` trait
- `e`, which uses the `LowerExp` trait
- `E`, which uses the `UpperExp` trait
- `o`, which uses the `Octal` trait
- `p`, which uses the `Pointer` trait
- `b`, which uses the `Binary` trait
- `x`, which uses the `LowerHex` trait
- `X`, which uses the `UpperHex` trait
例如:我们打印出内存地址:
rust
fn main() {
let x = 10; // 定义一个变量 x
let y = &x; // 定义一个指向 x 的引用 y
println!("{:p}", y); // 输出引用 y 的值,即内存地址
println!("{:?}", *y); // 输出引用 y 指向的内容,即 x 的值
println!("{x:?}"); // 命名参数
}
Rust 中还有一系列的宏,都是用的同样的格式控制规则,如format!
write!
writeln!
等。详细文档可以参见标准库文档中std::fmt
模块中的说明。
Rust 标准库中之所以设计了这么一个宏来做标准输出,主要是为了更好地错误检查。大家可以试试,如果出现参数个数、格式等各种原因不匹配会直接导致编译错误。而函数则不具备字符串格式化的静态检查功能,如果出现了不匹配的情况,只能是运行期错误。这个宏最终还是调用了std::io
模块内提供的一些函数来完成的。如果用户需要更精细地控制标准输出操作,也可以直接调用标准库来完成。