rust 发生移动是因为`*arg`的类型为`String`,它没有实现`Copy` trait [duplicate]

dced5bon  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(157)

此问题已在此处有答案

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(),就可以解决这个问题。
有人能帮我理解为什么吗?我认为通过在函数内部创建迭代器,函数拥有迭代器,并且应该能够随心所欲地改变/移动其值?

ct2axkht

ct2axkht1#

我认为通过在函数内部创建迭代器,函数拥有迭代器,并且应该能够随心所欲地改变/移动其值?
它拥有迭代器,但迭代器可能拥有也可能不拥有它的值。
这里迭代器来自&Vec,所以当前函数不拥有任何被迭代的数据,这意味着迭代器只传递&String:调用方拥有的引用。
只是不要解引用&String,没有理由在你显示的小代码中。
除此之外,您的match很容易被.ok_or(msg)?取代。
您的输出可能应该是&'static str(或Cow),因为rustc认为输入和错误消息之间存在关系。尽管我不得不说,无论是否添加上下文数据,我都会使用枚举。这允许更精细的错误选择和实现Error,这可能是有用的。

相关问题