我正试图从我的结构中获取生锈
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
字段?
答案 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 {