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!");
}
}或者这是生锈分析器的问题?我试着在谷歌上搜索,但什么也找不到。
发布于 2022-01-31 16:53:23
不允许使用顶级或-模式的原因是因为it would cause certain macro_rules! macros中断了。let表达式中的模式应该可以由单个$p:pat匹配,但不需要使用括号,$p:pat只会使用或模式的第一部分。
请注意,您可以轻松地处理此问题,正如编译器在尝试以下操作时所建议的那样:
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))`将或-表达式包装在括号中可以修复这个问题,因为现在一个括号表达式是顶级表达式:
let (Ok(x) | Err(x)) = foo(true);https://stackoverflow.com/questions/70929552
复制相似问题