【问题标题】:Is it possible to bind all the struct members of an enum variant to a single variable?是否可以将枚举变体的所有结构成员绑定到单个变量?
【发布时间】:2020-12-16 09:46:06
【问题描述】:

假设我定义和实例化一个枚举如下:

enum MyEnum {
    EmptyVariant,
    TupleVariant(u8),
    StructVariant {
        key: u8,
        value: char,
    }
}

let instance = MyEnum::StructVariant{key: 8, value: 'a'};

是否可以在不解构的情况下匹配此变体?例如,不要这样做:

if let MyEnum::StructVariant{key, value} = instance {
    eprintln!("key, value = {}, {}", key, value);
}

我宁愿写这样的东西:

if let MyEnum::StructVariant{VARIANT_MEMBERS} = instance {
    eprintln!("key, value = {}, {}", VARIANT_MEMBERS.key, VARIANT_MEMBERS.value);
}

在这个例子中,写出结构体变体的成员是良性的,但是在变体有很多成员的情况下,它会使代码难以阅读。

【问题讨论】:

  • 请注意,您只需要匹配您实际使用的字段。您可以使用.. 忽略其余部分。

标签: rust syntax enums


【解决方案1】:

我认为从今天开始是不可能的。

我确实看到了以下模式,它在实践中通过额外的中间类型实现了您所要求的:

而是将StructVariant 的所有所需成员放在一个实际的结构类型中,并让您的枚举将该结构用作StructVariant 的唯一字段。

struct MyVariant {
    key: u8,
    value: char
}

enum MyEnum {
    EmptyVariant,
    TupleVariant(u8),
    StructVariant(MyVariant)
}

if let MyEnum::StructVariant(x) = instance {
    eprintln!("key, value = {}, {}", x.key, x.value);
}

当您想将 StructVariant 的成员传递给其他函数或类型时,这也很方便。

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多