有没有办法做这样的事情?
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是触发该错误的地方。
答案 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 => ...,
}
存在一些限制:最重要的是,您无法获得与该值相关联的任何数据。您还需要在结构上#[derive(PartialEq, Eq)]
。