2017-01-22 2 views
2

이런 식으로 할 방법이 있습니까? 당신이 실제로 그것을하려고하면이 오류가enum 값의 별칭을 만드는 방법이 있습니까?

enum MyType { 
    Left, 
    Right, 

    #[cfg(universe = "normal")] 
    Port = Left, 
    #[cfg(universe = "normal")] 
    Starboard = Right, 

    #[cfg(universe = "mirror")] 
    Port = Right, 
    #[cfg(universe = "mirror")] 
    Starboard = Left, 

} 

(나는 MyType::을 추가했다) : 해당 오류가 트리거되는 경우

error[E0080]: constant evaluation error 
--> <anon>:9:12 
    | 
9 |  Port = MyType::Left, 
    |   ^^^^^^^^^^^^ unimplemented constant expression: enum variants 

Here

입니다.

답변

1

구현이 의미가 없습니다. 또 다른 방법

enum MyType { 
    One, 
    Two = One, 
} 

또는 말했다 : 당신은 같은 두 가지 열거 변종을 생성하는 컴파일러를 요구하고있다

enum MyType { 
    One = 1, 
    Two = 1, 
} 

을 간단 버전 봐. 그러나 열거 형의 전체 요점은 그들이 서로의 독점다는 것을이다.

대신, 단지 상수를 만들 :

enum MyType { 
    One, 
} 

const TWO: MyType = MyType::One; 
+0

예 별칭을 만들려고합니다. Rust에는 이미 문제없이 별칭이 있습니다. 열거 형 변형 별칭을 지원하면 어떤 것도 볼 수 없기 때문에 무언가를 깨뜨릴 수있는 방법을 보여줄 수 있습니까? – Timmmm

+0

@Timmmm : 문제는 패턴 일치입니다. 'x 1 => {}, 2 => {}}'와 일치하는 경우 어떤 팔이 사용됩니까? –

+0

그건 문제가되지 않습니다. 그것은'match x {One => {}, One => {}}'과 똑같이 행동합니다, 즉 오류를 출력합니다. (실제로 인쇄되는 오류는 'This is unreachable pattern'입니다.) – Timmmm

2

아니 내가 아는 한.

녹에있는 열거 형은 C에있는 것처럼 "상수 값의 묶음"이 아닙니다. 상수에 숫자 값을 연결하는 지원이 있지만 그게 전부입니다. 물론 모든 이름의 상수를 만들 수는 있지만 열거 형 값과 일치하는 패턴을 허용하지는 않습니다.

의미 상으로 enum 변형의 별칭은 유형 필드의 별칭과 조금 비슷합니다. 나는 두 개의 이름으로 식별되는 하나의 필드를 전혀 보지 못했습니다. 나는 그것을 지원하는 언어가 있는지 궁금합니다.


솔루션 내가 그들 사이의 변환을 두 개의 별도의 열거를 총알을 물고 생성을 제안합니다 :, 또한

use std::convert::From; 

enum Side { 
    Left, 
    Right, 
} 

enum PortSide { 
    Port, 
    Starboard, 
} 

#[cfg(not(universe = "mirror"))] 
impl From<Side> for PortSide { 
    fn from(s: Side) -> PortSide { 
     match s { 
      Side::Left => PortSide::Port, 
      Side::Right => PortSide::Starboard, 
     } 
    } 
} 

#[cfg(universe = "mirror")] 
impl From<Side> for PortSide { 
    fn from(s: Side) -> PortSide { 
     match s { 
      Side::Left => PortSide::Starboard, 
      Side::Right => PortSide::Port, 
     } 
    } 
} 

나는 기능이 필요하지 않도록 조언을 것 지정해야합니다 대신이 기능이 없으면 기본 동작을 허용합니다. 귀하의 경우, "정상"그것은 기본 동작이어야합니다 것 같습니다.

+0

2 차 열거 형을 추천하려고 생각했습니다. 하나의 표상이나 다른 표제를 원할 때가 있지만 동시에 표시되지는 않는 것처럼 보입니다. – Shepmaster

+0

C는 전 처리기를 통해 열거 형 및 구조체 필드 별칭을 "지원"합니다. 나는 여기서 반 농담 만한다. 'struct stat'은이 기능을 * 많이 사용합니다. struct 및 union 필드가 접두어로 쓰이는 이유 중 일부입니다 (다른 부분은 struct *와 일치하는 * 응용 프로그램 *에서 표준 라이브러리를 보호한다는 것입니다) 들). – user4815162342