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

Can the `let Some(var) = option;` syntax be used in a situation where it's known that it's not `None`?

当已知一个选项变量是非None时,通常可以这样写:

let var = option_var.unwrap();

在一个案例中,我 运行 进入了,这导致了关于移出借用上下文的错误。

if let Some(var) = option_var { ... }

(方便,因为它也允许 Some(ref mut var) = option_var)。

这行得通,但是在这种情况下,我不希望这是一个 if 语句。 写入 let Some(var) = option_var; 失败,错误为 "pattern None not covered"。

要明确这个问题不是关于借用的上下文

在已知不是None的情况下可以使用let Some(var) = option;语法吗?正在解决 "Pattern None not covered" 警告?或者这在 if 语句之外根本不受支持?

给定以下情况:

fn main() {
    let foo = Some(1);
    let Some(bar) = foo;
}

error[E0005]: refutable pattern in local binding: None not covered

let Some(x) = y引入一种模式; letmatch 语句和函数参数是模式匹配上下文,但由于在这种情况下模式不涵盖其他可能的情况,因此它不是有效的模式匹配上下文。

let Some(x) = y 语句适用的唯一上下文是 if let expressions and while let 循环。

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

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

let SomeEnum::First(first) = item;

我知道 itemSomeEnum::First。但是 Rust 不让我编译。

绕过这个问题的一种方法是使用这样的宏:

    macro_rules! unwrap {
        ($enum:path, $expr:expr) => {{
            if let $enum(item) = $expr {
                item
            } else {
                panic!()
            }
        }};
    }

您可以像这样调用 unwrap!

let first = unwrap!(SomeEnum::First, item);

PS。我在我的测试中使用这个。它有助于缩短测试时间。