2016-06-25 6 views
1

Was ist der beste Weg, mehrere Enum-Varianten zu haben, die den gleichen Wert haben? Dies ist ein Beispiel für das, was ich möchte, außer dass Rust es nicht mag.Mehrere Enum-Varianten mit gleichem Wert?

pub enum Nums { 
    Num1   = 0, 
    Num2   = 1, 
    Num3   = 2, 
    Num4   = 3, 
    Num5   = 4, 

    FirstNum  = 0, 
    MiddleNum  = 2, 
    LastNum   = 4, 
} 

Antwort

7

Sie müssen Konstanten verwenden; enum Varianten kann nicht haben den gleichen Tag-Wert wie andere Varianten.

pub enum Nums { 
    Num1   = 0, 
    Num2   = 1, 
    Num3   = 2, 
    Num4   = 3, 
    Num5   = 4, 
} 

pub const FirstNum: Nums = Nums::Num1; 
pub const MiddleNum: Nums = Nums::Num3; 
pub const LastNum: Nums = Nums::Num5; 

Wenn Sie nichts dagegen haben einen nächtlichen Compiler verwenden, können Sie #![feature(associated_consts)] zum Root-Modul hinzufügen und zugeordneten Konstanten verwenden. Auf diese Weise können Sie Nums::FirstNum verwenden usw.

impl Nums { 
    pub const FirstNum: Nums = Nums::Num1; 
    pub const MiddleNum: Nums = Nums::Num3; 
    pub const LastNum: Nums = Nums::Num5; 
} 
+0

Ooh, assoziierten Konstanten, sind diejenigen, genau das, was ich will. Ich habe mir gedacht, dass so etwas nicht möglich ist. Ich dachte darüber nach, die enum zu haben und dann alle Enum-Werte sowie die Duplikate als Konstanten neu zu definieren, vielleicht in einem Mod-Block. – graeme

0

Sie können auch auf die enum Methoden hinzufügen:

pub enum Nums { 
    Num1 = 0, 
    Num2 = 1, 
    Num3 = 2, 
    Num4 = 3, 
    Num5 = 4, 
} 

impl Nums { 
    pub fn first() -> Self { Nums::Num1 } 
    pub fn middle() -> Self { Nums::Num3 } 
    pub fn last() -> Self { Nums::Num5 } 
} 

fn main() { 
    println!("{}", Nums::first() as u8); 
} 
Verwandte Themen