簡體   English   中英

如何通過枚舉變體“切換”?

[英]How do I “toggle” through enum variants?

我想寫一個函數,它將提供的值切換/切換到枚舉中的下一個並在結尾處回繞:

enum Direction { NORTH, SOUTH, EAST, WEST }

例如, NORTH => SOUTHSOUTH => EASTEAST => WESTWEST => 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM