ide*_*n42 1 variable-assignment optional rust
如果已知选项变量为非None,则通常可以写入:
let var = option_var.unwrap();
Run Code Online (Sandbox Code Playgroud)
在我碰到的一个案例中,这引起了一个关于搬出借来的上下文的错误.
if let Some(var) = option_var { ... }
Run Code Online (Sandbox Code Playgroud)
(因为它允许Some(ref mut var) = option_var也很方便).
这是有效的,但在这种情况下,我不希望这是一个if声明.写入let Some(var) = option_var;失败,错误"模式None未覆盖".
要明确这个问题不是借用的背景.
可以在let Some(var) = option;语法的情况下使用,其中据了解,这是不是None?解决" None未覆盖模式"警告?或者这只是在if声明之外不支持?
鉴于以下情况:
fn main() {
let foo = Some(1);
let Some(bar) = foo;
}
Run Code Online (Sandbox Code Playgroud)
错误[E0005]:本地绑定中的可反射模式:
None未涵盖
let Some(x) = y介绍一种模式; let和match语句和函数的参数是模式匹配上下文,但由于在这种情况下,模式不包括其他可能的情况下,它是不是一个有效的模式匹配上下文.
该let Some(x) = y语句适用的唯一上下文是if let表达式和while let循环.
如果您确定(例如,使用较早assert!()或如果是"手动"引入)a None是不可能的,您可以使用unwrap().
我刚刚遇到了类似的枚举问题,例如:
let SomeEnum::First(first) = item;
我知道item是SomeEnum::First。但是 Rust 不会让我编译。
绕过这个问题的一种方法是使用这样的宏:
macro_rules! unwrap {
($enum:path, $expr:expr) => {{
if let $enum(item) = $expr {
item
} else {
panic!()
}
}};
}
Run Code Online (Sandbox Code Playgroud)
你可以这样调用unwrap!:
let first = unwrap!(SomeEnum::First, item);
附注。我在我的测试中使用它。它有助于缩短测试时间。