Skip to content

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模块内提供的一些函数来完成的。如果用户需要更精细地控制标准输出操作,也可以直接调用标准库来完成。

Released under the MIT License