【问题标题】:Can I create string enum in Rust?我可以在 Rust 中创建字符串枚举吗?
【发布时间】:2021-03-10 09:40:14
【问题描述】:

我想知道是否可以在 Rust 中使用常量字符串值创建 enum

我发现了上一个问题:How do I get an enum as a string?,它显示了一种解决方法,我可以使用它来对enum 的变体进行字符串化(我可以在enum 变体上使用.to_string() 并将它们的名称作为字符串获取)。

这个问题很有帮助,但这是我想要实现的目标:

enum StringEnum {
    Hello = "Hello",
    World = "World"
}

【问题讨论】:

  • Enum 派生自 enumerate,因此它总是希望每个条目都有一个 isize
  • @C14L 所以这是不可能的,因为字符串可以有不同的大小,每个 enum 值必须是相同的大小。我说的对吗?
  • 正确。在您链接的答案中,提到了一个似乎可以满足您要求的 Crate:strum_macros
  • 枚举的鉴别器在 Rust 中始终是整数类型。实现一个将字符串值返回为&'static str 的函数或在链接任务中实现Display 特征是可行的方法。您可以使用宏来减少样板。
  • @C14L 是的,我看到了这个依赖,但我只是在学习 Rust,所以我不想使用依赖。无论如何,谢谢你的回答。如果您想添加带有解释的答案,我会接受您的答案。

标签: rust enums


【解决方案1】:

如果你在 Rust 中有这样的枚举:

enum MyEnum {
    Hello,
    World
}

HelloWorld 是枚举变体。在 Rust 中,将每个变体表示为字符串是行不通的,因为每个变体的字符串长度不同,占用的字节数也不同。

Rust 中枚举的每个变体都分配给一个整数值。这是有效的,因为机器整数占用了指定数量的位(例如i32 vs i8),因此每个变体具有相同的大小。

如果您希望能够将枚举转换为字符串,则需要实现方法/格式化程序。最简单的方法是使用strum_macros crate:

#[derive(strum_macros::Display)]
pub enum StringEnum {
    Hello,
    World
}


fn main() {
    let hello: &'static str = StringEnum::Hello.into(); // "Hello"
    let world: String = StringEnum::World.to_string(); // "World"
}

How do I get an enum as a string? 中还提到了其他几种方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多