0
fn foo(ok: bool) -> Result<i32, i32> {
    if ok { Ok(0) } else { Err(0) }
}

fn main() {
    let Ok(x) | Err(x) = foo(true); // rust-analyzer error: top-level or-patterns are not allowed in `let` bindings

    if let Ok(x) | Err(x) = foo(true) { // rust-analyzer warn: irrefutable `if let` pattern
        println!("Working!");
    }
}

或者这是一个锈分析器错误?我试图谷歌但找不到任何东西。

4

1 回答 1

5

不允许使用顶级或模式的原因是因为它会导致某些macro_rules!中断。let 表达式中的模式应该可以由单个 匹配$p:pat,但不需要括起来,a$p:pat只会消耗 or 模式的第一部分。

请注意,您可以轻松解决此问题,正如您尝试此操作时编译器建议的那样:

error: top-level or-patterns are not allowed in `let` bindings
 --> src/main.rs:6:9
  |
6 |     let Ok(x) | Err(x) = foo(true);
  |         ^^^^^^^^^^^^^^ help: wrap the pattern in parentheses: `(Ok(x) | Err(x))`

将 or 表达式包含在括号中可以解决此问题,因为现在括号表达式是顶级表达式:

let (Ok(x) | Err(x)) = foo(true);
于 2022-01-31T16:53:23.893 回答