之所以发生移动,是因为"*arg"的类型为"String",而该类型不实现&qu


注意:我是Rust的新手,请原谅我的无知。

我有一个函数,它接受对向量的引用。然后,它根据该向量创建一个迭代器,并对其值进行处理。

代码:

fn new(args: &Vec<String>) -> Result<Config, &str> {
let mut args_iter = args.iter(); //create iterator
args_iter.next(); //skip the 0th item
let query = match args_iter.next() {
Some(arg) => *arg, //BREAKS
None => return Err("no query"),
};
let file = match args_iter.next() {
Some(arg) => arg.clone(), //WORKS
None => return Err("no file"),
};
//more stuff
}

现在我得到这个错误:

move occurs because `*arg` has type `String`, which does not implement the `Copy` trait

如果我将*arg更改为arg.clone(),就会解决这个问题。

有人能帮我理解为什么吗?我认为通过在函数内部创建迭代器,函数就拥有了迭代器并且应该能够随心所欲地改变/移动它的值?

我认为通过在函数内部创建迭代器,函数就拥有了迭代器并且应该能够随心所欲地改变/移动其值?

它拥有迭代器,但迭代器可能拥有也可能不拥有它的值。

这里的迭代器来自&Vec,所以当前函数不拥有任何被迭代的数据,这意味着迭代器只分发调用方拥有的&String:引用。

只是不要取消引用&String,没有理由在你显示的小代码中。

除此之外,您的match可以很容易地被.ok_or(msg)?取代。

您的输出可能应该是&'static str(或Cow(,正如定义的那样,rustc认为输入和错误消息之间存在关系。尽管我不得不说,无论是否添加上下文数据,我都会使用枚举。这允许更精细的错误选择和实现Error,这可能是有用的。

相关内容

最新更新