此问题已在此处有答案:
Cannot move out of borrowed content / cannot move out of behind a shared reference(2个答案)
两年前关闭。
警告:我是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()
,就可以解决这个问题。
有人能帮我理解为什么吗?我认为通过在函数内部创建迭代器,函数拥有迭代器,并且应该能够随心所欲地改变/移动其值?
1条答案
按热度按时间ct2axkht1#
我认为通过在函数内部创建迭代器,函数拥有迭代器,并且应该能够随心所欲地改变/移动其值?
它拥有迭代器,但迭代器可能拥有也可能不拥有它的值。
这里迭代器来自
&Vec
,所以当前函数不拥有任何被迭代的数据,这意味着迭代器只传递&String
:调用方拥有的引用。只是不要解引用
&String
,没有理由在你显示的小代码中。除此之外,您的
match
很容易被.ok_or(msg)?
取代。您的输出可能应该是
&'static str
(或Cow
),因为rustc认为输入和错误消息之间存在关系。尽管我不得不说,无论是否添加上下文数据,我都会使用枚举。这允许更精细的错误选择和实现Error
,这可能是有用的。