【问题标题】:Access fields of enum struct variant wrapped with a tuple struct使用元组结构包装的枚举结构变体的访问字段
【发布时间】:2015-12-07 23:15:40
【问题描述】:

我有一个包含多个单字段元组结构变体的枚举。每个元组结构字段都是不同的结构。我试过这段代码:

struct Foo { a: i32 }
struct Bar { b: i32 }

enum Foobar {
    Foo(Foo),
    Bar(Bar)
}

impl Foobar {
    fn new_foo() -> Foobar {
        Foobar::Foo(Foo { a: 1 })
    }
    fn new_bar() -> Foobar {
        Foobar::Bar(Bar { b: 2 })
    }
}

fn main() {
    let x = vec![Foobar::new_foo(), Foobar::new_bar()];
    let mut i = 0;

    while i < x.len() {
        let element = &x[i];
        match element {
            &Foobar::Foo(_) => { x[i].a = 3 },
            &Foobar::Bar(_) => { x[i].b = 4 }
        }
        i += 1
    }
}

编译器说:

错误:尝试访问类型 Foobar 上的字段 a,但未找到具有该名称的字段

我尝试了this question 中的解决方案,但它说:

错误:不能将不可变匿名字段借用为可变字段

如何修改vectorx的内容字段?

【问题讨论】:

    标签: struct enums rust


    【解决方案1】:

    这是因为您的向量和引用 element 是不可变的。试试这个:

    fn main() {
        let mut x = vec![Foobar::new_foo(), Foobar::new_bar()];
        let mut i = 0;
    
        while i < x.len() {
            let element = &mut x[i];
            match *element {
                Foobar::Foo(Foo { ref mut a }) => { *a = 3 },
                Foobar::Bar(Bar { ref mut b }) => { *b = 4 }
            }
            i += 1
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-07
      • 2021-06-05
      • 2021-05-21
      • 2016-01-16
      • 2019-03-02
      • 1970-01-01
      • 2012-04-23
      • 2013-10-21
      相关资源
      最近更新 更多