我可以這樣做:枚舉恆定值鏽
enum MyEnum {
A(i32),
B(i32),
}
但不是這樣的:
enum MyEnum {
A(123), // 123 is a constant
B(456), // 456 is a constant
}
我可以爲A
和B
結構與單場,然後執行該場,但我認爲可能有一個更簡單的方法。有沒有?
我可以這樣做:枚舉恆定值鏽
enum MyEnum {
A(i32),
B(i32),
}
但不是這樣的:
enum MyEnum {
A(123), // 123 is a constant
B(456), // 456 is a constant
}
我可以爲A
和B
結構與單場,然後執行該場,但我認爲可能有一個更簡單的方法。有沒有?
回答這個最好的方法是工作你爲什麼要在一個枚舉常量:你只是每個相關聯的變體的值,或者你希望每個變種是那個值(類似於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中不是自動合法的:枚舉具有特定值,它們不是位標記。)
看着這個的人可能偶然發現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);
}