警告:我是 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()
.
有人可以帮我理解为什么吗?我认为通过在函数内部创建一个迭代器,该函数拥有该迭代器并且应该能够随意改变/移动其值?
最佳答案
I thought that by creating an iterator inside the function, the function owns the iterator and should be able to mutate/move its values as it pleases?
它拥有迭代器,但迭代器可能拥有也可能不拥有它的值。
此处迭代器来自 &Vec
,因此当前函数不拥有任何正在迭代的数据,这意味着迭代器仅分发 &String
:由调用者拥有。
只是不要取消引用 &String
,没有理由在您显示的那么小代码中取消引用。
除此之外,您的匹配
可以轻松地被.ok_or(msg)?
替换。
您的输出可能应该是 &'static str
(或 Cow
),正如定义的 rustc 认为输入和错误消息之间存在关系。尽管我不得不说我会使用枚举,无论是否添加上下文数据。这允许更精细的错误选择并实现可能有用的 Error
。
关于rust - 发生移动是因为 `*arg` 的类型为 `String` ,该类型未实现 `Copy` 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67397018/