2017-01-22 111 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

相關問題