`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
引入一种模式; let
和 match
语句和函数参数是模式匹配上下文,但由于在这种情况下模式不涵盖其他可能的情况,因此它不是有效的模式匹配上下文。
let Some(x) = y
语句适用的唯一上下文是 if let
expressions and while let
循环。
如果您确定(例如使用较早的 assert!()
或引入 "by hand")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!()
}
}};
}
您可以像这样调用 unwrap!
:
let first = unwrap!(SomeEnum::First, item);
PS。我在我的测试中使用这个。它有助于缩短测试时间。
当已知一个选项变量是非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
引入一种模式; let
和 match
语句和函数参数是模式匹配上下文,但由于在这种情况下模式不涵盖其他可能的情况,因此它不是有效的模式匹配上下文。
let Some(x) = y
语句适用的唯一上下文是 if let
expressions and while let
循环。
如果您确定(例如使用较早的 assert!()
或引入 "by hand")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!()
}
}};
}
您可以像这样调用 unwrap!
:
let first = unwrap!(SomeEnum::First, item);
PS。我在我的测试中使用这个。它有助于缩短测试时间。