2017-01-22 110 views
2

有没有办法做这样的事情?有没有办法创建一个枚举值的别名?

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是其中触发该错误。

回答

1

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

enum MyType { 
    One, 
    Two = One, 
} 

或者说另一种方式:

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

你问的编译器创建两个枚举变量是相同的。但是枚举的整点是它们彼此独占。

相反,只需创建一个常数:

enum MyType { 
    One, 
} 

const TWO: MyType = MyType::One; 
+0

是的我试图创建别名。 Rust已经具有类型别名,没有问题。你可以举一个支持枚举变体别名的方式,因为我看不到任何东西的一个例子。 – Timmmm

+0

@Timmmm:问题是模式匹配。如果你有'匹配x {一个=> {},两个=> {}}',那么采取哪一种手段? –

+0

这不是问题。它的行为与您写'match x {One => {},One => {}}'的行为完全一样,即打印错误。 (它实际打印的错误是'这是一个无法访问的模式'。) – Timmmm

2

不受限制,只要我知道了。

Rust中的枚举不像C中那样是“捆绑常量值”,它支持将数值与常量关联,但就是这样。当然,你可以创建任何名字的常量,但是它们不允许你模式匹配一​​个枚举值。

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


的解决方案,我将建议其与它们之间的转换硬着头皮创建两个单独的枚举:

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

另外,我建议你不需要的功能,以指定,但是在没有此功能的情况下允许默认行为。在你的情况下,“正常”似乎应该是默认行为。

+0

我在考虑推荐一个二级枚举。似乎有些时候你想要一种表示或另一种表示,但不是同时存在。 – Shepmaster

+0

C通过预处理器“支持”enum和struct字段别名。我在这里只是半开玩笑 - 经典的Unix实现例如'struct stat'使用这个特性很多*,它是struct和union字段前缀的原因之一(另一部分是它保护标准库免受*应用程序的影响*#定义恰好匹配一个struct的东西领域)。 – user4815162342

相关问题