From aea7f0ef05099d9c67d3708ab3936f1f4bfcb043 Mon Sep 17 00:00:00 2001 From: sunface Date: Sun, 20 Feb 2022 11:57:34 +0800 Subject: [PATCH] update formatted-output.md --- contents/basic/formatted-output.md | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/contents/basic/formatted-output.md b/contents/basic/formatted-output.md index 0d1d5276..734fe140 100644 --- a/contents/basic/formatted-output.md +++ b/contents/basic/formatted-output.md @@ -350,6 +350,54 @@ fn main() { } ``` +## 在格式化字符串时捕获环境中的值(Rust1.58新增) + +在以前,想要输出一个函数的返回值,你需要这么做: +```rust +fn get_person() -> String { + String::from("sunface") +} +fn main() { + let p = get_person(); + println!("Hello, {}!", p); // implicit position + println!("Hello, {0}!", p); // explicit index + println!("Hello, {person}!", person = p); +} +``` +问题倒也不大,但是一旦格式化字符串长了后,就会非常冗余,而在1.58后,我们可以这么写: +```rust +fn get_person() -> String { + String::from("sunface") +} +fn main() { + let person = get_person(); + println!("Hello, {person}!"); +} +``` +是不是清晰、简洁了很多?甚至还可以将环境中的值用于格式化参数: +```rust +let (width, precision) = get_format(); +for (name, score) in get_scores() { + println!("{name}: {score:width$.precision$}"); +} +``` +但也有局限,它只能捕获普通的变量,对于更复杂的类型(例如表达式),可以先将它赋值给一个变量或使用以前的`name = expression`形式的格式化参数。 +目前除了`panic!`外,其它接收格式化参数的宏,都可以使用新的特性。对于`panic!` 而言,如果还在使用`Rust2015`或`2018`大版本 ,那`panic!("{ident}")`依然会被当成 正常的字符串来处理,同时编译器会给予`warn`提示。而对于`2021版本`,则可以正常使用: +```rust +fn get_person() -> String { + String::from("sunface") +} +fn main() { + let person = get_person(); + panic!("Hello, {person}!"); +} +``` + +输出: +```console +thread 'main' panicked at 'Hello, sunface!', src/main.rs:6:5 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +``` ## 总结 把这些格式化都牢记在脑中是不太现实的,也没必要,我们要做的就是知道 Rust 支持相应的格式化输出,在需要之时,读者再来查阅本文即可。