Rust编译器抱怨在代码不可用时在循环中使用移动值
Rust抱怨在循环中使用移动的值:Rust编译器抱怨在代码不可用时在循环中使用移动值,rust,Rust,Rust抱怨在循环中使用移动的值: #[派生(PartialEq,Eq)] 枚举动物{ 狗, 猫, } fn重复数据消除(动物:Vec 有趣的是,以下替代工程: a!=x=>{ 推(a); 阶段=部分(x); } _ => {} 当你写 match stage { // ... Some(a) => { // ... } } 您正在无条件地将值移出stage。块中的代码是否使用a并不重要;Rust看到的只是stage现在无效,不能再次使用 原因是什
#[派生(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次的人来说:whenstage
是Some(a)
和a==x
,在原始代码中,阶段
被移出,而不是立即重新分配,因此它不能再移出下一次迭代。注意:您可以在没有阶段
的情况下写入重复数据消除,只需在输出上进行匹配。last()
()。当然,如果这不是练习,您应该调用Vec::dedup
。
Some(a) if a != x => {
outs.push(a);
stage = Some(x);
}