[英]How do I “toggle” through enum variants?
我想寫一個函數,它將提供的值切換/切換到枚舉中的下一個並在結尾處回繞:
enum Direction { NORTH, SOUTH, EAST, WEST }
例如, NORTH
=> SOUTH
, SOUTH
=> EAST
, EAST
=> WEST
, WEST
=> NORTH
。
有沒有比In Rust中描述的手動創建靜態數組更簡單的方法,有沒有辦法迭代枚舉的值?
use Direction::*;
static DIRECTIONS: [Direction; 4] = [NORTH, SOUTH, EAST, WEST];
是不是枚舉假設是“枚舉”? 我依稀記得在Rust之前看過一個例子,但我似乎無法找到它。 由於Rust枚舉更像是工會/變體,我想這會讓事情復雜化。
弗拉基米爾的答案是正確的,但程序員必須記住在向enum
添加新成員時更改幻數“4”。 turn
這個定義應該更容易維護:
#[derive(Debug, Copy, Clone, FromPrimitive)]
enum Direction {
NORTH = 0,
SOUTH,
EAST,
WEST,
}
fn turn(d: Direction) -> Direction {
match FromPrimitive::from_u8(d as u8 + 1) {
Some(d2) => d2,
None => FromPrimitive::from_u8(0).unwrap(),
}
}
我猜這樣的事情會起到作用:
#[macro_use]
extern crate num_derive;
extern crate num_traits;
use num_traits::FromPrimitive;
#[derive(Debug, Copy, Clone, FromPrimitive)]
enum Direction {
NORTH = 0,
SOUTH,
EAST,
WEST,
}
fn turn(d: Direction) -> Direction {
FromPrimitive::from_u8((d as u8 + 1) % 4).unwrap()
}
fn main() {
use Direction::*;
for &d in [NORTH, SOUTH, EAST, WEST].iter() {
println!("{:?} -> {:?}", d, turn(d));
}
}
這不需要unsafe
因為它使用自動派生的FromPrimitive
特征。
我更喜歡通過match
語句顯式編碼下一個方向:
#[derive(Debug)]
enum Direction {
North,
South,
East,
West,
}
impl Direction {
fn turn(&self) -> Self {
use Direction::*;
match *self {
North => South,
South => East,
East => West,
West => North,
}
}
}
fn main() {
use Direction::*;
for i in &[North, South, East, West] {
println!("{:?} -> {:?}", i, i.turn());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.