Arn*_*rny 1 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,
});
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是得到这个错误
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,
});
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何获得该arg.dv
领域?
尽管您已经有了答案,但我将解释问题并提供其他解决方案。我还建议阅读Rust中有效使用迭代器。
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!");
}
Run Code Online (Sandbox Code Playgroud)
这将使用arg_tbl.iter()
,它将从借用arg_tbl
。String
没有实现该Copy
特征,因此无法将其复制到中arguments
。因为它是借来的,所以也不能移动。这将导致错误消息cannot move out of borrowed content
。因为String
确实实现了Clone
,所以您可以克隆它以获取副本。这就是为什么clone()
在第13行添加a可以解决此问题的原因。
也可以使用不借用的迭代器来解决此问题;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 });
}
Run Code Online (Sandbox Code Playgroud)
现在,您还可以像下面这样简化for循环:
for arg in arg_tbl {
Run Code Online (Sandbox Code Playgroud)