通过变量访问结构体字段

Nes*_*ews 5 rust

我想迭代结构体的字段并为每次迭代访问其各自的值:

#[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)

如何通过变量访问字段?

Tee*_*Tee 8

通过使用模式匹配,您可以迭代其字段。

#[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)


ssh*_*124 6

Rust 没有任何直接迭代其字段的方法。如果您的数据在语义上表示某种类型的集合,则您应该使用集合类型,例如Vec、数组或其中的集合之一。std::collections

如果您仍然觉得需要迭代这些字段,也许您需要重新考虑完成任务的方法,看看是否没有更惯用/正确的方法来完成它