Rust에서 문자열 열거형 만들기
이 기사에서는 Rust에서 string enum을 만드는 방법을 배웁니다.
Rust에서 enum
생성
Rust에서 enum
은 가능한 여러 버전 중 하나인 데이터를 나타냅니다. enum
키워드는 가능한 여러 버전 중 하나일 수 있는 유형의 개발을 허용합니다.
struct
로 유효한 모든 버전은 enum
으로도 유효합니다. 또한 enum
의 각 버전에는 선택적으로 관련 데이터가 있을 수 있습니다.
enum Information {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}
데이터가 없는 변형, 명명된 데이터가 있는 변형, 익명 데이터가 있는 변형이 있습니다. 변형을 정의하는 구문은 tuple structs
와 같은 구조체를 정의하는 구문을 모방합니다.
개별 구조체 정의와 달리 enum
은 단일 유형입니다. enum
값은 모든 변형과 일치할 수 있습니다.
이것이 enum
이 종종 합계 유형이라고 불리는 이유입니다. 잠재적 enum
값 세트는 가능한 변형 값 세트의 합계입니다.
::
구문을 사용하여 enum
자체의 이름으로 범위가 지정된 각 변형의 이름을 나타냅니다.
Rust의 ‘스트럼’
‘Strum’은 ‘Rust’에서 ’enums’ 및 문자열 작업을 더 쉽게 해주는 ‘매크로’와 특성의 모음입니다.
EnumString
: 자동 파생 std::str::FromStr
이 enum
에 적용됩니다. 각 enum
버전은 이름과 일치합니다.
이것은 아래에 설명된 것처럼 serialize="DifferentName"
을 사용하거나 속성에서 string="DifferentName"
을 사용하여 재정의할 수 있습니다. 동일한 변형에 여러 역직렬화를 추가할 수 있습니다.
변형에 추가 데이터가 포함된 경우 역직렬화는 해당 데이터를 기본값으로 설정합니다. default
속성은 단일 데이터 매개변수를 사용하여 튜플 변형에 적용할 수 있습니다.
일치하는 항목이 발견되지 않으면 지정된 변형이 반환되고 입력 문자열이 매개변수로 캡처됩니다. 다음은 EnumString
상속으로 생성된 코드의 예입니다.
#[derive(EnumString)]
enum Cars {
BMW,
Volvo { range:usize },
#[strum(serialize="Toyota",serialize="b")]
Toyota(usize),
#[strum(disabled="true")]
Fiat,
}
FromStr
의 기본 구현은 변형 이름과만 일치합니다. Display
및 ToString
은 모두 지정된 enum
변형을 반환합니다. 이를 통해 enum
에서 단위 스타일 변형을 문자열로 변환하고 다시 그 반대로 변환할 수 있습니다.
또한 ToString
및 Display
는 다음 기준에 따라 적절한 직렬화를 선택합니다.
- 문자열 속성이 존재하는 경우 이 값을 사용합니다. 버전당 하나만 허용됩니다.
- 가장 긴 값을 가진 직렬화된 속성이 선택됩니다. 이 동작을 원하지 않으면 대신 문자열을 사용하십시오.
- 마지막으로
serialize
또는to string
속성이 없는 경우 변형 이름이 사용됩니다.
Display
는 ToString
보다 선호됩니다. ::std::fmt::Display
를 구현하는 모든 유형은 기본적으로 ToString
을 구현합니다.
use std::string::ToString;
#[derive(Display, Debug)]
enum Cars {
#[strum(serialize="redred")]
BMW,
Volvo { range:usize },
Toyota(usize),
Ferrari,
}
fn debug_cars() {
let BMW = Cars::BMW;
assert_eq!(String::from("BMWBMW"), BMW.to_string());
}
fn main () { debug_cars(); }