gpt4 book ai didi

当代码不是时,Rust 编译器提示在循环中使用移动值

转载 作者:行者123 更新时间:2023-12-03 11:25:52 27 4
gpt4 key购买 nike

Rust 提示在循环中使用移动的值:

#[derive(PartialEq, Eq)]
enum Animal {
Dog,
Cat,
}

fn dedup(animals: Vec<Animal>) -> Vec<Animal> {
let mut stage = None;
let mut outs = vec![];

for x in animals {
match stage {
None => stage = Some(x),
Some(a) => {
if a != x {
outs.push(a);
stage = Some(x);
}
}
}
}
if let Some(a) = stage {
outs.push(a);
}
outs
}

错误信息是:

error[E0382]: use of moved value
--> src/lib.rs:14:18
|
14 | Some(a) => {
| ^ value moved here, in previous iteration of loop
|

当我阅读这段代码时,我看到 stage 被移动到 a 中,然后它可能被推到 outs 中,然后就不再使用了再次。为什么这是编译器错误?

Playground

有趣的是,以下替代作品:

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

最佳答案

当你写作时

match stage {
// ...
Some(a) => {
// ...
}
}

无条件地将值移出stage。 block 中的代码是否使用a 并不重要; Rust 看到的只是 stage 现在失效了,不能再次使用。

原因

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

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

关于当代码不是时,Rust 编译器提示在循环中使用移动值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64056336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com