因为逃避,我以为给定了这样的代码:
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
2条答案
按热度按时间cigdeys31#
这是因为这是一个格式化程序字符串,而不是任何字符串,因此
{
和}
都是重要的。请注意此处使用的转义符号:
{{
等于{
,因此}
本身是没有相应打开的闭合。在第一种情况下,您有 open,close,close,因此第二种close是无法比拟的。
在第二种情况下,您有 literal
{
,close,并且第一个close不匹配。tquggr8v2#
这是Rust从左到右解析格式字符串的方式造成的。
{}}
解析{
,它调用找到的}
。然后它转到}
,并报告错误。类似地,对于{{}
,{
调用{
或{
。(转义的{
)或}
。它找到它,然后转到下一个字符}
,然后报告错误。在这两种情况下,错误都是由最后一个}
引起的。