为什么 Rust 对 '{{' 和 '}}' 的处理方式不同?

moc*_*cha 1 rust

由于转义,我认为给出以下代码:

fn main() {
    println!("{}}");
    println!("{{}");
}
Run Code Online (Sandbox Code Playgroud)

我会收到类似于unmatched '}' in format string第一个println!unmatched '{' in format string第二个的错误消息println!。然而,我实际上在两种使用中都遇到了相同的错误println!

error: invalid format string: unmatched `}` found
 --> src/main.rs:2:17
  |
2 |     println!("{}}");
  |                 ^ unmatched `}` in format string
  |
  = note: if you intended to print `}`, you can escape it using `}}`

error: invalid format string: unmatched `}` found
 --> src/main.rs:3:17
  |
3 |     println!("{{}");
  |                 ^ unmatched `}` in format string
  |
  = note: if you intended to print `}`, you can escape it using `}}`
Run Code Online (Sandbox Code Playgroud)

这意味着第一个println!必须采用格式参数,而第二个则不需要。为什么会有这种行为?

操场

tad*_*man 9

这是因为这是一个格式化字符串,而不仅仅是任何字符串,因此 和{都很}重要。

请注意此处使用的转义符号:{{等于{,因此}它本身就是一个关闭而没有相应的打开。

在第一种情况下,您有opencloseclose,因此第二个 close 是无与伦比的。

在第二种情况下,您有Literal{close,并且第一个 close 是不匹配的。