2016-04-29 52 views
6

我可以這樣做:枚舉恆定值鏽

enum MyEnum { 
    A(i32), 
    B(i32), 
} 

但不是這樣的:

enum MyEnum { 
    A(123), // 123 is a constant 
    B(456), // 456 is a constant 
} 

我可以爲AB結構與單場,然後執行該場,但我認爲可能有一個更簡單的方法。有沒有?

回答

20

回答這個最好的方法是工作你爲什麼要在一個枚舉常量:你只是每個相關聯的變體的值,或者你希望每個變種那個值(類似於C或enum C++)?

對於第一種情況,它可能更有意義見好就收枚舉變量無數據,並進行了功能:

enum MyEnum { 
    A, 
    B, 
} 

impl MyEnum { 
    fn value(&self) -> i32 { 
     match *self { 
      MyEnum::A => 123, 
      MyEnum::B => 456, 
     } 
    } 
} 
// call like some_myenum_value.value() 

這種方法可應用於許多次,許多獨立的部分關聯每個變體的信息,例如也許你也需要.name() -> &'static str方法。

另外,對於第二種情況,你可以指定明確的標記值就像C/C++:

enum MyEnum { 
    A = 123, 
    B = 456, 
} 

這可能是在所有相同的方式match版,但也可以轉換爲整數MyEnum::A as i32。 (請注意,像MyEnum::A | MyEnum::B這樣的計算在Rust中不是自動合法的:枚舉具有特定值,它們不是位標記。)

1

看着這個的人可能偶然發現FromPrimitive的引入和棄用。這裏可能有用的替代品是enum_primitive。它允許你使用C-like枚舉並讓它們在數字和邏輯表示之間進行轉換:

#[macro_use] 
extern crate enum_primitive; 
extern crate num; 

use num::FromPrimitive; 

enum_from_primitive! { 
    #[derive(Debug, PartialEq)] 
    enum FooBar { 
     Foo = 17, 
     Bar = 42, 
     Baz, 
    } 
} 

fn main() { 
    assert_eq!(FooBar::from_i32(17), Some(FooBar::Foo)); 
    assert_eq!(FooBar::from_i32(42), Some(FooBar::Bar)); 
    assert_eq!(FooBar::from_i32(43), Some(FooBar::Baz)); 
    assert_eq!(FooBar::from_i32(91), None); 
}