有没有办法创建枚举值的别名?

时间:2017-01-22 14:17:31

标签: enums rust alias

有没有办法做这样的事情?

enum MyType {
    Left,
    Right,

    #[cfg(universe = "normal")]
    Port = Left,
    #[cfg(universe = "normal")]
    Starboard = Right,

    #[cfg(universe = "mirror")]
    Port = Right,
    #[cfg(universe = "mirror")]
    Starboard = Left,

}

如果您真的尝试过,则会收到此错误(我必须添加MyType::):

error[E0080]: constant evaluation error
 --> <anon>:9:12
  |
9 |     Port = MyType::Left,
  |            ^^^^^^^^^^^^ unimplemented constant expression: enum variants

Here是触发该错误的地方。

3 个答案:

答案 0 :(得分:2)

据我所知。

Rust中的枚举不是&#34;一组常量值&#34;就像他们在C中一样。支持将数值与常量相关联,但这就是它。当然,你可以创建任何名称的常量,但它们不允许你模式匹配枚举值。

从某种意义上说,枚举变体上的别名有点像类型字段上的别名。我从未见过任何由两个名字识别的单个字段的出现;我想知道是否有任何支持它的语言。

解决方案我建议它咬住子弹并创建两个单独的枚举,并在它们之间进行转换:

use std::convert::From;

enum Side {
    Left,
    Right,
}

enum PortSide {
    Port,
    Starboard,
}

#[cfg(not(universe = "mirror"))]
impl From<Side> for PortSide {
    fn from(s: Side) -> PortSide {
        match s {
            Side::Left => PortSide::Port,
            Side::Right => PortSide::Starboard,
        }
    }
}

#[cfg(universe = "mirror")]
impl From<Side> for PortSide {
    fn from(s: Side) -> PortSide {
        match s {
            Side::Left => PortSide::Starboard,
            Side::Right => PortSide::Port,
        }
    }
}

此外,我建议您不要求指定功能,而是在没有此功能的情况下允许默认行为。在你的情况下,&#34;正常&#34;似乎它应该是默认行为。

答案 1 :(得分:1)

您的实施没有任何意义。看一个更简单的版本:

enum MyType {
    One,
    Two = One,
}

另一种说法:

enum MyType {
    One = 1,
    Two = 1,
}

您要求编译器创建两个相同的枚举变体,但枚举的全部内容是它们彼此独占

相反,创建一个常量(关联或其他):

enum MyType {
    One,
}

const TWO: MyType = MyType::One;

答案 2 :(得分:1)

您可以使用关联常量来获取与枚举变体非常相似的常量:

#[derive(PartialEq, Eq)]
pub enum X {
    A,
    B,
}

impl X {
    pub const A1: X = X::A;
}

关联常量在枚举中命名,就像普通变体一样。它与模式匹配兼容 - 即使是无法访问的警告和详尽的匹配规则也能正常工作。

match x {
    X::A1 => ...,
    X::B => ...,
}

playground

存在一些限制:最重要的是,您无法获得与该值相关联的任何数据。您还需要在结构上#[derive(PartialEq, Eq)]

相关问题