我想迭代结构体的字段并为每次迭代访问其各自的值:
#[derive(Default, Debug)]
struct A {
foo: String,
bar: String,
baz: String
}
fn main() {
let fields = vec!["foo", "bar", "baz"];
let a: A = Default::default();
for field in fields {
let value = a[field] // this doesn't work
}
}
Run Code Online (Sandbox Code Playgroud)
如何通过变量访问字段?
通过使用模式匹配,您可以迭代其字段。
#[derive(Default, Debug)]
struct A {
foo: String,
bar: String,
baz: String
}
impl A {
fn get(&self, field_string: &str) -> Result<&String, String> {
match field_string {
"foo" => Ok(&self.foo),
"bar" => Ok(&self.bar),
"baz" => Ok(&self.baz),
_ => Err(format!("invalid field name to get '{}'", field_string))
}
}
}
fn main() {
let fields = vec!["foo", "bar", "baz"];
let a = A {
foo: "value_of_foo".to_string(),
bar: "value_of_bar".to_string(),
baz: "value_of_baz".to_string()
};
for field in fields {
let value = a.get(field).unwrap();
println!("{:?}", value);
}
}
Run Code Online (Sandbox Code Playgroud)
回报
"value_of_foo"
"value_of_bar"
"value_of_baz"
Run Code Online (Sandbox Code Playgroud)
我编写了一个宏,可以自动为任何结构实现此类代码。 field_accessor (https://github.com/europeanplaice/field_accessor)。
Cargo.toml
[dependencies]
field_accessor = "0"
Run Code Online (Sandbox Code Playgroud)
"value_of_foo"
"value_of_bar"
"value_of_baz"
Run Code Online (Sandbox Code Playgroud)
它还返回
"value_of_foo"
"value_of_bar"
"value_of_baz"
Run Code Online (Sandbox Code Playgroud)
Rust 没有任何直接迭代其字段的方法。如果您的数据在语义上表示某种类型的集合,则您应该使用集合类型,例如Vec
、数组或其中的集合之一。std::collections
如果您仍然觉得需要迭代这些字段,也许您需要重新考虑完成任务的方法,看看是否没有更惯用/正确的方法来完成它