我可以做到:

enum MyEnum {
    A(i32),
    B(i32),
}

但不是这个:

enum MyEnum {
    A(123), // 123 is a constant
    B(456), // 456 is a constant
}

我可以用一个字段创建AB的 struct ,然后实现该字段,但我认为可能有更简单的方法.有吗?

推荐答案

解决这个问题的最佳方法是找出为什么要在枚举中添加常量:是否将值与每个变量关联起来,或者您希望每个变量都达到be值(比如C或C++中的enum)?

对于第一种情况,让enum变量不包含任何数据,并创建一个函数可能更有意义:

enum MyEnum {
    A,
    B,
}

impl MyEnum {
    fn value(&self) -> i32 {
        match *self {
            MyEnum::A => 123,
            MyEnum::B => 456,
        }
    }
}
// call like some_myenum_value.value()

这种方法可以多次应用,将许多独立的信息与每个变量关联起来,例如,也许你也想要一个.name() -> &'static str方法.将来,这些函数甚至可以标记为const个函数.

对于第二种情况,可以指定显式整数标记值,就像C/C++:

enum MyEnum {
    A = 123,
    B = 456,
}

这可以以相同的方式设置为match,但也可以转换为整数MyEnum::A as i32.(请注意,像MyEnum::A | MyEnum::B这样的计算在Rust中并不自动合法:枚举有特定的值,它们不是位标志.)

Rust相关问答推荐

为什么幻影数据不能自动推断?

在Rust中赋值变量有运行时开销吗?

亚性状上位性状上的 rust 病伴生型界限

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

在自定义序列化程序中复制serde(With)的行为

使用铁 rust S还原对多个数组执行顺序kronecker积

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

在运行特定测试时,如何 suppress cargo test 的空输出?

`actix-web` 使用提供的 `tokio` 运行时有何用途?

Rust wasm 中的 Closure::new 和 Closure::wrap 有什么区别

将引用移动到线程中

Rust 异步循环函数阻塞了其他future 任务的执行

Rust 中的生命周期:borrow 的 mut 数据

具有在宏扩展中指定的生命周期的枚举变体数据类型

了解 Rust 闭包:为什么它们持续持有可变引用?

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

如何创建递归borrow 其父/创建者的 struct ?

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?