Rust에서 문자열 열거형 만들기

Nilesh Katuwal 2023년1월30일
  1. Rust에서 enum 생성
  2. Rust의 ‘스트럼’
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::FromStrenum에 적용됩니다. 각 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의 기본 구현은 변형 이름과만 일치합니다. DisplayToString은 모두 지정된 enum 변형을 반환합니다. 이를 통해 enum에서 단위 스타일 변형을 문자열로 변환하고 다시 그 반대로 변환할 수 있습니다.

또한 ToStringDisplay는 다음 기준에 따라 적절한 직렬화를 선택합니다.

  1. 문자열 속성이 존재하는 경우 이 값을 사용합니다. 버전당 하나만 허용됩니다.
  2. 가장 긴 값을 가진 직렬화된 속성이 선택됩니다. 이 동작을 원하지 않으면 대신 문자열을 사용하십시오.
  3. 마지막으로 serialize 또는 to string 속성이 없는 경우 변형 이름이 사용됩니다.

DisplayToString보다 선호됩니다. ::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(); }

관련 문장 - Rust String