2014-09-16 1 views
4

이의 우리가 내가 /이 열거의 다음에 제공된 값을 전환 전환 함수를 작성 (너무 주위에 포장)하고 싶은 열거에게"토글은"

enum Direction { NORTH, SOUTH, EAST, WEST } 

있다고 가정 해 봅시다 변형. 예 : NORTH => SOUTH, SOUTH는 => EAST ..... WEST => NORTH

질문 :

내가 수동에 설명 된대로 같은 정적 배열을 만드는 것보다 더 쉬운 방법이 있는지 궁금하네요 this 질문 :

static DIRECTIONS: [Direction, ..4] = [NORTH, SOUTH, EAST, WEST]; 

이 열거 형은 '열거'하는 생각되지 않습니다

? 나는 녹이기 전에 예를 보는 것을 막연히 기억하지만, 나는 그것을 찾을 수 없을 것 같다.

+0

녹에서 반복 할 수있는 방법이있다 [의 중복 가능성 열거 형 값을 통해?] (http://stackoverflow.com/questions/21371534/in-rust-is-there-a-way-to-iter-to-the-values-of-an-enum) –

+1

unsafe하게 할 수 있어야한다.'let d : Direction = unsafe {std :: mem :: transmute ((NORTH as u8) + 1)}; // 남부. 자신의 위험에 사용하십시오 ... –

답변

6

나는 이런 식으로 뭔가 트릭을 할 것 같아요 (녹 열거 더 노동 조합/변종처럼 때문에, 나는이 일을 복잡하게 생각) :

#[deriving(Show, FromPrimitive)] 
enum Direction { 
    NORTH = 0, 
    SOUTH, 
    EAST, 
    WEST 
} 

fn turn(d: Direction) -> Direction { 
    FromPrimitive::from_u8((d as u8 + 1)%4).unwrap() 
} 

fn main() { 
    for &d in [NORTH, SOUTH, EAST, WEST].iter() { 
     println!("{} -> {}", d, turn(d)); 
    } 
} 

시험이 here. 이것은 unsafe을 필요로하지 않으며, 자동적으로 도출 된 FromPrimitive 형질을 사용합니다.

+0

안전한 방법 (내가 왜 안전하지 않은 변환을 대답으로 제안하는 대신 쓴 이유입니다)을 사용하고 싶었지만 여전히 모든 열거 형의 배열을 만드는 방법에 의존합니다. OP는 그가 이미 –

+0

@ PaoloFalabella를 알고있을 가능성을 언급하고 있습니다. 배열이란 무엇입니까? 그렇지 않습니다. 그 배열은 요점을 설명하기위한 것입니다. 주요 작업은 안전하고 배열을 사용하지 않는'turn()'함수에서 수행됩니다. –

+0

아, 내 잘못이야! 죄송합니다. 코드를 완전히 잘못 읽었습니다. –

3

블라디미르의 대답은 정확하지만 프로그래머는 enum에 새 회원을 추가 할 때 마법 숫자 "4"를 변경해야한다는 것을 기억해야합니다. turn에 대한이 정의는 더 쉽게 유지 관리 할 수 ​​있어야한다 :

#[deriving(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() } 
    } 
} 
+0

나는 당신의 해결책을 좋아한다! 귀하의 솔루션은 틀림없이 변하기 쉽습니다 (조금 더 장황하지만 여전히 추론하기 쉽습니다). 감사! –

1
내가 명시 적으로 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()); 
    } 
} 
관련 문제