非常抱歉问这么简单的问题... 一天前,我开始学习 Rust 并尝试使用 println!
方法。
fn main() {
println!("Hello {}!", "world");
}
-> Hello world!
然后,我发现了其他的格式样式:{}, {:}, {:?}, {?}
,...
我知道{}
代表String
,但是我不明白其他的格式样式有何不同。这些样式之间有什么区别?我认为{:?}
代表数组或向量。是这样吗?
请用示例代码解释这些格式样式 :(
非常抱歉问这么简单的问题... 一天前,我开始学习 Rust 并尝试使用 println!
方法。
fn main() {
println!("Hello {}!", "world");
}
-> Hello world!
然后,我发现了其他的格式样式:{}, {:}, {:?}, {?}
,...
我知道{}
代表String
,但是我不明白其他的格式样式有何不同。这些样式之间有什么区别?我认为{:?}
代表数组或向量。是这样吗?
请用示例代码解释这些格式样式 :(
为了严谨起见,std::fmt
格式化语法由两部分组成:
{<position-or-name>:<format>}
where:
<position-or-name>
可以是参数位置:println!("Hello {0}!", "world");
,请注意这在编译时检查<position-or-name>
也可以是一个名称:println!("Hello {arg}!", arg = "world");
<format>
是以下格式之一,每种格式都要求参数实现特定的trait,在编译时进行检查默认情况下,在没有位置、名称或格式的情况下,会选择匹配{}
索引的参数,并使用Display
trait。
然而,有各种各样的 traits!从上面的链接中:
?
⇒ Debugo
⇒ Octalx
⇒ LowerHexX
⇒ UpperHexp
⇒ Pointerb
⇒ Binarye
⇒ LowerExpE
⇒ UpperExp如果需要,还可以在将来添加新的 traits。
println!()
是一个宏,使用了 std::fmt
语法,并且 {}
表示参数。如果括号为空({}
),则相应的参数需要实现 Display
特性,如果包含 :?
,则表示应该使用参数的 Debug
实现。
关键在于这里与类型无关,而是与它们实现的 特性 相关。例如,Vec
向量实现了 Debug
,但它们没有实现 Display
,这就是为什么你不能对它们使用 {}
,而 {:?}
就可以正常工作的原因。