我写了这个代码片段:
let my_option: Option<()> = None;
if my_option.is_some() {
my_option.unwrap();
}
Clippy告诉我使用:
if let Some(..) = my_option {
my_option.unwrap();
}
Some(..)
是什么意思?在某些情况下,它只是像使用_
那样降低值吗?我在哪里可以找到更多关于何时何地可以使用..
的信息?
我认为Clippy的警告有点误导人。让我们首先看一下完整的警告消息:
warning: called `unwrap` on `my_option` after checking its variant with `is_some`
--> src/main.rs:4:9
|
3 | if my_option.is_some() {
| ---------------------- help: try: `if let Some(..) = my_option`
4 | my_option.unwrap();
| ^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(clippy::unnecessary_unwrap)]` on by default
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap
Clippy在检查了is_some()
之后抱怨unwrap()
的使用。如果你只使用is_some()
或unwrap()
, Clippy不会抱怨。因为使用if let
可以更容易地完成,所以只有在检查后才被认为是惟一的解包裹。
我相信Clippy建议if let Some(..) = my_option
的原因是代码没有跟踪内部值后来是如何使用的,所以建议需要在某种程度上是通用的。实际上,您几乎不会在这里直接写..
,而是写像
if let Some(value) = my_option
将内部值绑定到变量。还要注意,if let Some(..) = my_option
不使用该选项,而if let Some(value) = my_option
使用该选项(如果内部类型不是Copy
)。
在简介:
- 如果你想检查一个选项是否为
Some
,但对包含的值不感兴趣,你应该使用if my_option.is_some()
。 - 如果你在编译时确定你的选项必须是
Some
,并且你想提取内部值,使用my_option.unwrap()
而不包含任何if
。 - 如果你不知道选项是否为
Some
,并且你只想在它是的情况下提取内部值,则使用if let Some(value) = my_value
。
完成@SvenMarnach的精彩回答,..
在模式中确实有意义,它确实与_
非常相似:而_
表示"忽略此处的一个字段",..
表示"忽略此处的零个或多个字段"。
_
的地方,您也可以使用..
,尽管如果稍后添加字段可能会导致错误。唯一的例外是标识符模式——你可以做if let _ = 123
,但不能做if let .. = 123
,以及结构模式,因为它有特殊的语法:忽略一个字段是Struct { field: _ }
,而忽略多个字段是Struct { .. }
。