迭代循环时,不能移出借来的内容

时间:2016-11-29 09:30:15

标签: arrays struct rust

我正试图从我的结构中获取生锈

fn check_args(command: i32, args: Vec<String>) -> Vec<Argument> {
    let arg_tbl: [ArgsTable; 5] = [
        ArgsTable { cc: 0, ac: 1, dv: "4".to_string() },
        ArgsTable { cc: 1, ac: 1, dv: "4".to_string() },
        ArgsTable { cc: 1, ac: 2, dv: "in.txt".to_string() },
        ArgsTable { cc: 4, ac: 3, dv: "1".to_string() },
        ArgsTable { cc: 6, ac: 2, dv: "out.txt".to_string() },
    ];
    let mut arguments: Vec<Argument> = Vec::new();
    if args.len() == 0 {
        for arg in arg_tbl.iter() {
            if arg.cc == command {
                arguments.push(Argument {
                    code: arg.ac,
                    value: arg.dv,
                });
            }
        }
    }
}

但是会收到此错误

    |
151 |                     value: arg.dv
    |                            ^^^ cannot move out of borrowed content

如何获得arg.dv字段?

1 个答案:

答案 0 :(得分:4)

虽然您已经有了答案,但我会解释问题并提供不同的解决方案。我还建议您阅读Effectively Using Iterators In Rust

我将从MCVE开始,您也可以在the playground进行测试:

struct ArgsTable {
    dv: String,
}

fn check_args() -> Vec<ArgsTable> {
    let arg_tbl: [ArgsTable; 2] = [
        ArgsTable {
            dv: "4".to_string(),
        },
        ArgsTable {
            dv: "out.txt".to_string(),
        },
    ];
    let mut arguments: Vec<ArgsTable> = Vec::new();
    for arg in arg_tbl.iter() {
        arguments.push(ArgsTable { dv: arg.dv });
    }
    arguments
}

fn main() {
    check_args();
    println!("Hello, world!");
}

这使用arg_tbl.iter(),它将从arg_tbl借用。 String未实现Copy特征,因此无法将其复制到arguments。因为它是借来的,所以也不能移动。这会导致错误消息cannot move out of borrowed content。由于String确实实现了Clone,因此您可以克隆它以获取副本。这就是为什么在第13行添加clone()可以解决问题。

也可以使用不借用的迭代器来解决这个问题; into_iter。但目前还没有用于数组的按值迭代器。如果使用arg_tbl.into_iter(),则数组将取消引用到切片中,您仍将通过引用进行迭代!但是如果你将数组更改为Vec,它将无需克隆:

let arg_tbl = vec![
    ArgsTable {
        dv: "4".to_string(),
    },
    ArgsTable {
        dv: "out.txt".to_string(),
    },
];
let mut arguments: Vec<ArgsTable> = Vec::new();
for arg in arg_tbl.into_iter() {
    arguments.push(ArgsTable { dv: arg.dv });
}

您现在也可以像这样简化for循环:

for arg in arg_tbl {