了解 Rust 枚举的移动语义

nz_*_*_21 2 move rust

is_some()所以我正在查看for的 impl Option,我注意到它match *self {}在幕后使用......所以它在内部移动它。

我的问题是,如果它被移动,我怎样才能做这样的事情?https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f094da12290b77bad526674467e51043

fn main() {
    let x = Option::Some(3);
    x.is_some();
    x.is_some();
}
Run Code Online (Sandbox Code Playgroud)

我的期望是我应该只能调用is_some()一次,而下次调用它时,我应该会收到某种错误,说明它已被移动......但是不,一切都编译得很好。

我有什么误解吗?

dki*_*kim 5

*selfinmatch *self { ... }不会移动(或复制)self指向的内容。来自“ The Rust Reference ”(强调我的),

A 的match行为有所不同,具体取决于检查者表达式是位置表达式还是值表达式。如果检查者表达式是值表达式,则首先将其计算到临时位置, ...

当审查者表达式为地点表达式时,匹配不分配临时位置;然而,按值绑定可以从内存位置复制或移动。...

*self是地点表达。来自“ The Rust Reference ”(强调我的),

表达式分为两大类:位置表达式和值表达式。...

位置表达式是表示内存位置的表达式。这些表达式是引用局部变量、静态变量、取消引用 ( *expr)、数组索引表达式 ( expr[expr]) 、字段引用 ( expr.f) 和带括号的位置表达式的路径。所有其他表达式都是值表达式。

表达式是表示实际值的表达式。


您可能还想知道身体Some(_) => true中的手臂match不会束缚任何东西。来自“铁锈参考”,

与标识符模式不同,它不会复制、移动或借用它匹配的值。

其中“it”表示通配符模式 ( _)。