【发布时间】:2021-07-27 07:29:46
【问题描述】:
注意: 我的问题类似于这个问题,但似乎没有解决我的用例。 Can enum variants have constant associated values?
问题说明
我的服务器返回一个国家(很长的列表),它在内部映射到一个枚举(有一组提前知道的有效可能性)。
我需要一些与国家/地区相关的数据(例如语言)。
相关数据是“恒定的”,出于人体工程学/性能原因,将数据“附加”到枚举变量是有意义的。
人为的例子:
我有一个语言列表和一个国家列表
#[derive(Serialize,Deserialize)
enum Language {
English,
Spanish,
French,
// .. 100 more
}
#[derive(Serialize,Deserialize)
enum Country {
USA,
England,
France,
Mexico,
Spain
// .. 100 more
}
内部我希望枚举将语言值与国家/地区隐式关联:
// what I want
#[derive(Serialize,Deserialize)
enum Country {
USA(Language),
England(Language),
// ... more countries with associated languages...
}
- 创建“国家/地区”时,我不想提供语言,而只想提供
Country::country_name(没有语言) - 序列化/反序列化时,应隐式添加语言
查看 serde.rs 文档,您可以添加字段属性
#[serde(default)]
或
#[serde(default = "path")]
但是
-
default并非所有国家/地区都有默认语言 - 而是取决于它所在的国家/地区变体 -
path- 在没有国家值的情况下调用该函数,因此与default的效果相似
我考虑过的一些选项
- 手动实现序列化/反序列化 - 但我有很多情况并且容易出错
- 惰性常量值?详细的
【问题讨论】:
-
我敢说有一个简洁的解决方案,其中包含宏可以自动执行“手动”部分,但我对 Serde 的了解不足以显示代码。
-
我知道你说过,你想将
Language附加到Country变体,但没有必要。您可以创建一个元组结构:struct Localization(Country, Language),然后像往常一样对国家/地区进行反序列化,并且可能有一个Localization“构造函数”,它采用Country并自动搜索正确的Language。这种方法值得深入研究吗? -
为什么不使用
std::collections::HashMap<Country, Language>?
标签: rust enums serde associated-value