为什么 let 绑定中不允许使用顶级 or-patterns?
Why are top level or-patterns not allowed in let bindings?
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!");
}
}
或者这是生锈分析器的错误?我尝试 Google 但找不到任何东西。
不允许top-levelor-patterns的原因是it would cause certain macro_rules!
macros要中断。 let 表达式中的模式应该可以由单个 $p:pat
匹配,但不需要括号,$p:pat
只会消耗 or-pattern.[=16= 的第一部分]
请注意,您可以轻松解决此问题,正如编译器在您尝试此操作时建议的那样:
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-expression 括在括号中修复了这个问题,因为现在括号表达式是 top-level 表达式:
let (Ok(x) | Err(x)) = foo(true);
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!");
}
}
或者这是生锈分析器的错误?我尝试 Google 但找不到任何东西。
不允许top-levelor-patterns的原因是it would cause certain macro_rules!
macros要中断。 let 表达式中的模式应该可以由单个 $p:pat
匹配,但不需要括号,$p:pat
只会消耗 or-pattern.[=16= 的第一部分]
请注意,您可以轻松解决此问题,正如编译器在您尝试此操作时建议的那样:
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-expression 括在括号中修复了这个问题,因为现在括号表达式是 top-level 表达式:
let (Ok(x) | Err(x)) = foo(true);