2014-01-27 103 views
22

我來自一個Java的背景,我可能有一些像enum Direction { NORTH, SOUTH, EAST, WEST},我可以做的每個值的東西又與增強的for循環,如:在Rust中,是否有一種迭代枚舉值的方法?

for(Direction dir : Direction.values()) { 
    //do something with dir 
} 

我願做類似的事情有鏽枚舉。

+0

有[問題' Enum' trait](https://github.com/mozilla/rust/issues/5417),它可能會被派生出來給方向:: values(){...}中的dir。也許)。 – huon

回答

18

不,沒有。我認爲這是因爲Rust中的枚舉比Java中的枚舉強大得多 - 它們實際上已經是全面的algebraic data types。例如,您希望如何迭代此枚舉的值:

enum Option<T> { 
    None, 
    Some(T) 
} 

它的第二個成員,Some,不是一個靜態常量 - 您使用它來創建的Option<T>值:

let x = Some(1); 
let y = Some("abc"); 

因此,有你可以遍歷的任何枚舉值不理智的方式。當然,我認爲,可以給編譯器添加對靜態枚舉(即只有靜態項的枚舉)的特殊支持,所以它會生成一些函數,它返回枚舉值或靜態與他們的矢量,但我相信編譯器的額外複雜性是不值得的。

如果您確實需要此功能,則可以編寫自定義語法擴展(請參閱this問題)。該擴展應該接收一個標識符列表並輸出一個枚舉和一個靜態常量向量作爲內容。一個常規的宏也會在某種程度上起作用,但據我記得你不能用多重性轉錄宏參數兩次,所以你必須手動寫入兩次枚舉元素,這是不方便的。

而且這個問題可能是某些利益:#5417

當然,你總是可以編寫代碼,它返回手工枚舉元素的列表,。

+0

這很有幫助。我認爲對我來說最簡單的事情可能是寫一個我的枚舉的impl,它返回值的列表或迭代器或其他東西。謝謝! – dougli1sqrd

+5

我恭敬地不同意枚舉枚舉不值得。這是一個常見和有用的事情是_爲什麼他們被稱爲enums_!當然,代數的力量是偉大的,但對於最常見的情況來說,方便也是很好的。 –

+1

@RexKerr,那只是我對這個功能仍然不存在的原因的建議。我相信,在相應的問題中停止討論支持我的觀點。順便說一句,當我需要一次對所有枚舉元素進行操作時,它通常是某種索引(例如哈希映射),它允許通過某個鍵檢索枚舉值,並且該索引應該手動構建。 –

19

如果枚舉爲C類(如你的例子),那麼你可以這樣做:

use self::Direction::*; 
use std::slice::Iter; 

#[derive(Debug)] 
pub enum Direction { North, South, East, West } 

impl Direction { 
    pub fn iterator() -> Iter<'static, Direction> { 
     static DIRECTIONS: [Direction; 4] = [North, South, East, West]; 
     DIRECTIONS.into_iter() 
    } 
} 


fn main() { 
    for dir in Direction::iterator() { 
     println!("{:?}", dir); 
    } 
} 
+0

這實際上似乎可能是一個更好的選擇,而不是使用鏽的「枚舉」來滿足您的需求。我真的不知道,如果把它們稱爲枚舉,工會或其他什麼的話,會不會更好。此外,作爲一個強大的變體,您可以關聯其他信息,例如:[North(0),South(180),EAST(90),WEST(270)]等,或者給定元組幫助...... – bluejekyll

4

我在crate plain_enum實現的基本功能。

它可以用來如下聲明一個類C枚舉:

#[macro_use] 
extern crate plain_enum; 

plain_enum_mod!(module_for_enum, EnumName { 
    EnumVal1, 
    EnumVal2, 
    EnumVal3, 
}); 

然後將允許你做這樣的事情如下:關於

for value in EnumName::values() { 
    // do things with value 
} 

let enummap = EnumName::map_from_fn(|value| { 
    convert_enum_value_to_mapped_value(value) 
}) 
相關問題