개요

enum IpAddrKind {
    V4,
    V6,
}

let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

fn route(ip_type: IpAddrKind) { ... }
route(IpAddrKind::V4);
route(IpAddrKind::V6);
  • enum 안의 요소를 variant 라고 함.
  • 열거형을 정의한 식별자에 의해 네임스페이스가 생김.

구조체에 포함시켜 사용하는 예

struct IpAddr {
    kind: IpAddrKind,
    address: String,
}

let home = IpAddr {
    kind: IpAddrKind::V4,
    address: String::from("127.0.0.1"),
};

let loopback = IpAddr {
    kind: IpAddrKind::V6,
    address: String::from("::1"),
};
  • 구조체에 enum과 String을 같이 사용.
  • 열거형 variant 에 어떤 종류의 데이터라도 넣을 수 있다.

String variant

enum IpAddr {
    V4(String),
    V6(String),
}

let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String:from("::1"));

튜플 variant

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr:V6(String::from("::1"));

다양형 타입의 variant

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}
  • Quit: 연관된 데이터가 없음
  • Move: 익명 구조체
  • Write: String
  • ChangeColor: 3개의 i32

구조체와 열거형

struct QuitMessage; // 유닛 구조체
struct MoveMessage {
    x: i32,
    y: i32,
}
struct WriteMessage(String); // 튜플 구조체
struct ChangeColorMessage(i32, i32, i32); // 튜플 구조체

메소드

enum Message {
    ...
    Write(String),
}

impl Message {
    fn call(&self) {
        ...
    }
}

let m = Message::Write(String::from("hello"));
m.call();

Optional Null

enum Option<T> {
    Some(T),
    None,
}

let some_number = Some(5);
let some_string = Some("a string");
let absent_number: Option<i32> = None;
  • null 일 수 있는 값을 사용하기 위해서는 Option으로 만들어야 함.
  • Rust에서는 i8과 같은 타입의 값을 사용할 떄 유효한 값을 갖고 있다는 보장을 함.
  • Option을 사용할 때는 값이 있을지 없을지 걱정해야함.
  • std::option::Option 에 이미 구현되어 있음.
    • 기본 라이브러리이므로 명시적으로 가져올 필요 없다.
    • Option::을 붙이지 않고 Some, None 사용가능.

참고자료