【问题标题】:Move occurs because `*arg` has type `String`, which does not implement the `Copy` trait [duplicate]发生移动是因为 `*arg` 的类型为 `String`,它没有实现 `Copy` 特征 [重复]
【发布时间】:2021-07-27 12:33:20
【问题描述】:

警告:我是 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(),问题就会解决。

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

【问题讨论】:

  • "error[E0412]: 在这个范围内找不到类型Config" => minimal reproducible example
  • @Stargateur 这很有用,谢谢。未来会牢记

标签: rust iterator borrow-checker


【解决方案1】:

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

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

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

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

除此之外,您的match 很容易被.ok_or(msg)? 替换。

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

【讨论】:

  • 如果你不取消引用(但也不克隆)它也会中断。但是我明白你关于拥有向量而不是向量内的值的观点。感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2015-10-08
  • 2015-09-19
  • 2019-12-08
  • 2015-11-11
  • 2015-07-15
相关资源
最近更新 更多