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

pu82cl6c  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(121)

因为逃避,我以为给定了这样的代码:

fn main() {
    println!("{}}");
    println!("{{}");
}

对于第一个println!,我会得到类似于unmatched '}' in format string的错误消息,对于第二个println!,我会得到类似于unmatched '{' in format string的错误消息。

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 `}}`

这意味着第一个println!必须接受一个格式参数,而第二个没有。为什么会出现这种行为?
Playground

cigdeys3

cigdeys31#

这是因为这是一个格式化程序字符串,而不是任何字符串,因此{}都是重要的。
请注意此处使用的转义符号:{{等于{,因此}本身是没有相应打开的闭合。
在第一种情况下,您有 opencloseclose,因此第二种close是无法比拟的。
在第二种情况下,您有 literal {close,并且第一个close不匹配。

tquggr8v

tquggr8v2#

这是Rust从左到右解析格式字符串的方式造成的。{}}解析{,它调用找到的}。然后它转到},并报告错误。类似地,对于{{}{调用{{。(转义的{)或}。它找到它,然后转到下一个字符},然后报告错误。在这两种情况下,错误都是由最后一个}引起的。

相关问题