【问题标题】:Assign associated non mutable constant data to enum variants将关联的非可变常量数据分配给枚举变量
【发布时间】: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...
}

  1. 创建“国家/地区”时,我不想提供语言,而只想提供 Country::country_name(没有语言)
  2. 序列化/反序列化时,应隐式添加语言

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

#[serde(default)]

#[serde(default = "path")]

但是

  1. default 并非所有国家/地区都有默认语言 - 而是取决于它所在的国家/地区变体
  2. path - 在没有国家值的情况下调用该函数,因此与default 的效果相似

我考虑过的一些选项

  1. 手动实现序列化/反序列化 - 但我有很多情况并且容易出错
  2. 惰性常量值?详细的

【问题讨论】:

  • 我敢说有一个简洁的解决方案,其中包含宏可以自动执行“手动”部分,但我对 Serde 的了解不足以显示代码。
  • 我知道你说过,你想将Language 附加到Country 变体,但没有必要。您可以创建一个元组结构:struct Localization(Country, Language),然后像往常一样对国家/地区进行反序列化,并且可能有一个Localization“构造函数”,它采用Country 并自动搜索正确的Language。这种方法值得深入研究吗?
  • 为什么不使用std::collections::HashMap<Country, Language>

标签: rust enums serde associated-value


【解决方案1】:

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

使用 lazy_staticconst 数据(在我的情况下,根据问题中的示例,数据不是 const'able)

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
     }
  }
}

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多