我正在尝试从使用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字段?

最佳答案

尽管您已经有了答案,但我将解释问题并提供其他解决方案。我还建议阅读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 {

关于arrays - 循环时无法移出借用的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40862191/

10-15 09:55