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

kai*_*kai 8 rust

我很遗憾地问这么简单的问题......前一天,我开始学习Rust并尝试了这个println!方法.

fn main() {
  println!("Hello {}!", "world");
}
-> Hello world!
Run Code Online (Sandbox Code Playgroud)

然后,我找到了其他格式样式:{}, {:}, {:?}, {?},...

我知道{}相反String,但我不理解其他格式风格.这些款式如何相互不同?我认为{:?}是数组或向量.这是对的吗?

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

Mat*_* M. 14

为了彻底,std::fmt格式化语法由两部分组成:

{<position-or-name>:<format>}
Run Code Online (Sandbox Code Playgroud)

哪里:

  • <position-or-name>可以是参数位置:println!("Hello {0}!","world");`,请注意它在编译时被检查
  • <position-or-name> 也可以是一个名字: println!("Hello {arg}!", arg = "world");
  • <format>以下格式之一,其中每种格式都需要参数来实现特定的特征,在编译时检查

在没有位置,名称或格式的情况下,默认值是选择与索引匹配的参数{}并使用Display特征.然而,有各种特质!从上面的链接:

  • 没有⇒显示
  • ? ⇒调试
  • o ⇒八进制
  • x ⇒LowerHex
  • X ⇒OpperHex
  • p ⇒指针
  • b ⇒二进制
  • e ⇒LowerExp
  • E ⇒OpperExp

如果有必要,将来可以添加新的特征.


lje*_*drz 5

println!()是一个使用std::fmt语法{}指示参数的宏.如果括号保留为空({}),则相应的参数需要实现Display特征,如果它们包含特征,则:?意味着Debug应该使用参数的实现.

最重要的是,它不是这里相关的参数类型,而是它们实现的特征.例如,Vectw实现Debug,但它们没有实现Display,这就是为什么你不能使用{}它们同时{:?}工作得很好.