`let Some(var)= option;`语法可以用在已知它不是'None`的情况下吗?

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声明之外不支持?

lje*_*drz 6

鉴于以下情况:

fn main() {
    let foo = Some(1);
    let Some(bar) = foo;
}
Run Code Online (Sandbox Code Playgroud)

错误[E0005]:本地绑定中的可反射模式:None未涵盖

let Some(x) = y介绍一种模式; letmatch语句和函数的参数是模式匹配上下文,但由于在这种情况下,模式不包括其他可能的情况下,它是不是一个有效的模式匹配上下文.

let Some(x) = y语句适用的唯一上下文是if let表达式和while let循环.

如果您确定(例如,使用较早assert!()或如果是"手动"引入)a None是不可能的,您可以使用unwrap().


Tan*_*nin 5

我刚刚遇到了类似的枚举问题,例如:

let SomeEnum::First(first) = item;

我知道itemSomeEnum::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);

附注。我在我的测试中使用它。它有助于缩短测试时间。