我有一个函数,它接受对向量的引用。然后,它根据该向量创建一个迭代器,并对其值进行处理。
代码:
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
,这可能是有用的。