在类似结构体的枚举变量中更新字段

10
我可以使用结构体更新语法来更新单个结构体,但我无法在类似结构体的枚举变量中使用它。同时,我也不能使用点语法来更新类似结构体的枚举变量中的字段。
例如:
enum Enum {
    Struct {
        field1: i32,
        field2: i32,
    }
}

fn main() {
    let mut my_enum = Enum::Struct {
        field1: 1,
        field2: 2,
    };

    my_enum = Enum::Struct {
        field1: 1,
        .. my_enum
    };

    my_enum = match my_enum {
        strct@Enum::Struct { field1, field2 } => Enum::Struct {
            field1: 1,
            .. strct
        },
    };
}

两种方法都会给我一个错误:

functional record update syntax requires a struct

这段代码:
my_enum.field1 = 3;

给我以下错误:

attempted access of field `field1` on type `Enum`, but no field with that name was found

如何从类似结构体的枚举变量中更新字段?


这并不是真正的“枚举内部结构体”。这样的东西看起来像 enum Foo { Variant(StructName) }。我忘记你所拥有的确切名称,但它可能是一个“枚举结构体”或者是一个“结构体变量枚举”? - Shepmaster
相关但并不回答你的问题的是最近的博客系列,它讨论了在某些方面将这两个概念结合在一起。 - Shepmaster
1
根据参考文献,它被称为“类结构体枚举变量”,但我认为通常只称为结构体变量。 - Vladimir Matveev
我找到了这个,但有一个人说他“不知道这怎么可能行得通”。你有什么想法,为什么这不能行得通? - antoyo
是的,这不起作用,因为strct的类型是Enum,而不是Enum::Struct,因为Enum::Struct本身并不是一种类型。因此,即使在这种特殊情况下它始终是Enum::Struct,编译器也无法推断出它的类型。 - Vladimir Matveev
1个回答

11

以下是一种方法:

match my_enum {
    Enum::Struct { ref mut field1, .. } => {
        *field1 = 3;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接