Ива*_*хин 2 rust rust-analyzer
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!");
}
}
Run Code Online (Sandbox Code Playgroud)
或者这是一个 Rust 分析器错误?我尝试用谷歌搜索但找不到任何东西。
不允许顶级 or 模式的原因是它会导致某些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))`
Run Code Online (Sandbox Code Playgroud)
将 or 表达式括在方括号中可以解决此问题,因为现在方括号表达式是顶级表达式:
let (Ok(x) | Err(x)) = foo(true);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |