rust - 发生移动是因为 `*arg` 的类型为 `String` ,该类型未实现 `Copy` 特征

标签 rust iterator borrow-checker

警告:我是 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/

相关文章:

java - For-Each 循环替代方案 - 说明

rust - 获取每行输入第一个单词的迭代器的简单实现

Rust 借用检查器仅在返回具有相同生命周期的引用的函数时多次提示借用是可变的

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 解析整数或使用 unwrap_or 提供默认值,但使用默认值时打印错误消息

random - 如何使用字符串或数字在 Rust 中为随机数生成器提供种子

callback - 如何 : Idiomatic Rust for callbacks with gtk (rust-gnome)

java - 如何实现迭代器的故障安全行为

rust - 迭代特征对象的可变引用向量

rust - 借用检查器提示多次借用,而只有一次会发生