将关联的不可变常量数据分配给枚举变体



注意:我的问题与这个问题类似,但似乎不能解决我的用例。枚举变体可以具有常量关联值吗?

问题解释

我的服务器返回一个国家/地区(很长的列表),该国家/地区在内部映射到一个枚举(有一组预先已知的有效可能性)。

我需要一些与国家相关的数据(例如语言)。

相关数据是";常数";并且出于人体工程学/性能的原因;附";到枚举变体。

示例:

我有一个语言列表和国家列表

#[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...
}
  1. 当创建";Country";,我不想提供语言,而只是Country::country_name(没有语言)
  2. 在序列化/反序列化时,应隐式添加该语言

查看serde.rs文档,您可以添加一个字段属性

#[serde(default)]

#[serde(default = "path")]

但是

  1. default并不是所有国家/地区都有默认语言,而是取决于它所包含的国家/地区变体
  2. path-调用函数时不带country值,因此效果与default类似

我考虑的一些选项

  1. 手动实现序列化/反序列化-但我有很多情况,而且很容易出错
  2. 惰性常数值?冗长的

这不是一个理想的解决方案,但在我的用例中是合理的:

使用lazy_staticconst数据(在我的情况下,根据问题中的示例,数据不稳定)

impl Country {
fn language() -> '&static Language { // my language is more complex than just a simple type described in this question so i do want to have static instances . understandably in the answer it seems overkill
match self {
USA => {
lazy_static! {
let lang: Language = Language::English; /// in reality more data here...
}
&lang
}
France => { ...}
// ... more countries
}
}
}

最新更新