我想从 Rust 中的枚举中提取结构:
struct CakeInfo {
best_by: String,
cost: i32,
calories: i32,
}
enum CakeCategory{
Chocolate(CakeInfo),
Sponge(CakeInfo),
Fruit(CakeInfo),
}
如果枚举的所有变体都接受相同类型的结构,是否有一种简便的方法来使用 match 语句提取该值?
我想做的事:
cake = CakeCategory::Sponge(CakeInfo {
best_by: "24-10-2024",
cost_pence: 450,
calories: 800,
})
cake_best_by = match cake {
_(cake_info) => cake_info.best_by
}
编译器希望我做什么:
cake = CakeCategory::Sponge(CakeInfo {
best_by: "24-10-2024",
cost_pence: 450,
calories: 800,
})
cake_best_by = match cake {
Chocolate(cake_info) => cake_info.best_by,
Sponge(cake_info) => cake_info.best_by,
Fruit(CakeInfo) => cake_info.best_by,
}
在示例中,这并不是太麻烦,但在具有更多变体的枚举中,这很快就会变得非常重复。我知道诸如
if let
之类的模式,其中用户只对单个枚举变体感兴趣,但在这样的用例中这会更加乏味。
是否有任何语法可以完成与我尝试的等效操作?
如果所有变体都具有相同的有效负载,则强烈表明您的数据结构设计不佳。 考虑一下这个设计:
struct CakeInfo {
best_by: String,
cost: i32,
calories: i32,
category: CakeCategory,
}
enum CakeCategory {
Chocolate,
Sponge,
Fruit,
}
通过从所有
CakeCategory
变体中删除有效负载,我们可以简单地向category
添加一个CakeInfo
字段并表达完全相同的数据,但不需要match
来获取内部信息,特别是当我们不关心时关于类别。