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