println的格式风格有什么区别?

13

非常抱歉问这么简单的问题... 一天前,我开始学习 Rust 并尝试使用 println! 方法。

fn main() {
  println!("Hello {}!", "world");
}
-> Hello world!

然后,我发现了其他的格式样式:{}, {:}, {:?}, {?},...

我知道{}代表String,但是我不明白其他的格式样式有何不同。这些样式之间有什么区别?我认为{:?}代表数组或向量。是这样吗?

请用示例代码解释这些格式样式 :(


4
请查看此处 https://doc.rust-lang.org/std/fmt/index.html 和此处 http://stackoverflow.com/documentation/rust/362/hello-world/1248/advanced-usage-of-println。 - aSpex
@aSpex 谢谢!!!这就是我想要的!!! :) - kai
2个回答

24

为了严谨起见,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!从上面的链接中:

  • nothing ⇒ Display
  • ? ⇒ Debug
  • o ⇒ Octal
  • x ⇒ LowerHex
  • X ⇒ UpperHex
  • p ⇒ Pointer
  • b ⇒ Binary
  • e ⇒ LowerExp
  • E ⇒ UpperExp

如果需要,还可以在将来添加新的 traits。


7

println!() 是一个宏,使用了 std::fmt 语法,并且 {} 表示参数。如果括号为空({}),则相应的参数需要实现 Display 特性,如果包含 :?,则表示应该使用参数的 Debug 实现。

关键在于这里与类型无关,而是与它们实现的 特性 相关。例如,Vec 向量实现了 Debug,但它们没有实现 Display,这就是为什么你不能对它们使用 {},而 {:?} 就可以正常工作的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接