Rust编译器抱怨在代码不可用时在循环中使用移动值

Rust编译器抱怨在代码不可用时在循环中使用移动值,rust,Rust,Rust抱怨在循环中使用移动的值: #[派生(PartialEq,Eq)] 枚举动物{ 狗, 猫, } fn重复数据消除(动物:Vec 有趣的是,以下替代工程: a!=x=>{ 推(a); 阶段=部分(x); } _ => {} 当你写 match stage { // ... Some(a) => { // ... } } 您正在无条件地将值移出stage。块中的代码是否使用a并不重要;Rust看到的只是stage现在无效,不能再次使用 原因是什

Rust抱怨在循环中使用移动的值:

#[派生(PartialEq,Eq)]
枚举动物{
狗,
猫,
}
fn重复数据消除(动物:Vec

有趣的是,以下替代工程:

a!=x=>{
推(a);
阶段=部分(x);
}
_ => {}
当你写

match stage {
    // ...
    Some(a) => {
        // ...
    }
}
您正在无条件地将值移出
stage
。块中的代码是否使用
a
并不重要;Rust看到的只是
stage
现在无效,不能再次使用

原因是什么

Some(a) if a != x => {
    outs.push(a);
    stage = Some(x);
}

之所以有效,是因为在模式中包含
if
使其成为一种有条件的移动。
a
只有在
a!=x
时才会移出,而当这种情况发生时,
stage
总是被重新分配。

非常明确,对于像我这样错过了5次的人来说:when
stage
Some(a)
a==x
,在原始代码中,
阶段
被移出,而不是立即重新分配,因此它不能再移出下一次迭代。注意:您可以在没有
阶段
的情况下写入
重复数据消除
,只需在
输出上进行匹配。last()
()。当然,如果这不是练习,您应该调用
Vec::dedup
Some(a) if a != x => {
    outs.push(a);
    stage = Some(x);
}