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

时间:2016-10-18 05:18:09

标签: rust

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

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

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

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

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

2 个答案:

答案 0 :(得分:14)

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

{<position-or-name>:<format>}

其中:

  • <position-or-name>可以是参数位置:println!("Hello {0}!",&#34; world&#34;);`,请注意它在编译时检查
  • <position-or-name>也可以是名称:println!("Hello {arg}!", arg = "world");
  • <format>one of the following formats,其中每种格式都需要参数来实现特定的特征,在编译时检查

缺少位置,名称或格式的默认设置是选择与{}索引匹配的参数并使用Display特征。然而,有各种特质!从上面的链接:

  • 没有⇒显示
  • ?⇒调试
  • o⇒Octal
  • x⇒LowerHex
  • X⇒UpperHex
  • p⇒指针
  • b⇒Binary
  • e⇒LowerExp
  • E⇒OpperExp

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

答案 1 :(得分:5)

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

底线是它不是参数&#39;与此相关的类型,但the traits they implement。例如,Vec执行Debug,但他们没有实施Display,这就是为什么你不能{}使用{:?} $scope.$on $apply 1}}工作正常。