gpt4 book ai didi

rust - 使用 serde 将枚举变量的名称作为字符串获取

转载 作者:行者123 更新时间:2023-12-03 23:38:56 26 4
gpt4 key购买 nike

我正在尝试获取枚举变量的名称,因为字符串 serde 会期望/创建。例如,假设我有以下枚举:

#[derive(Serialize, Deserialize)]
#[serde(rename_all="camelCase")]
pub enum SomeEnum {
WithoutValue,
withValue(i32),
}
我怎样才能获得变体的 serde 名称?就像是
serde::key_name(SomeEnum::WithoutValue) // should be `withoutValue`
serde::key_name(SomeEnum::WithValue) // should be `withValue`
我可以使用 serde_json hack ,对于没有值的变体,我可以这样做:
serde_json::to_string(SomeEnum::WithoutValue).unwrap(); // yields `"withoutValue"` with quotation marks
这不是最好的解决方案,因为我需要去掉引号,但在技术上可以工作。
更糟糕的是当 enum 变体具有值时。它变得更加困惑。
serde_json::to_string(SomeEnum::WithValue(0)).unwrap(); // yields `"{\"second\":0}"
有没有一种干净的方法来实现这一目标?我找不到将 key 名称作为字符串获取的 serde API。

最佳答案

提取变体信息的一种稳定但有些样板重的方法是实现自定义 Serializerserialize_*_variant 收集变体名称职能。
这是 serde_variant 采用的方法. @Mendy 提到这个箱子只适用于单位变体。这是自述文件中的示例。

use serde_variant::to_variant_name;

#[derive(Serialize)]
enum Foo {
Var1,
#[serde(rename = "VAR2")]
Var2,
}

assert_eq!(to_variant_name(&Foo::Var1).unwrap(), "Var1");
assert_eq!(to_variant_name(&Foo::Var2).unwrap(), "VAR2");
另一个要提到的缺点是,这只适用于默认的、外部标记的枚举表示。其他表示不使用 serialize_*_variant职能。

关于rust - 使用 serde 将枚举变量的名称作为字符串获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67215966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com