Enum
enum 정의
enum IpaddrKind {
V4,
V6
}
enum 타입은 같은 타입에 속한 필드는 모두 같은 enum 타입으로 봄. 때문에 아래와 같이 IpAddrKind 타입의 파라미터를 받는 함수에 V4, V6 모두 사용 가능.
enum IpAddrKind {
V4,
V6
}
fn main() {
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
route(four);
route(six);
}
fn route(ip_type: IpAddrKind) {
// do something..
}
아래와 같이 값을 지정할 수도 있음. 보다시피 타입은 자유롭게 지정 가능. 이렇게 값을 지정할 경우, 값은 필수가 됨.
enum IpAddrKind {
V4(u8, u8, u8, u8),
V6(String)
}
let four = IpAddrKind::V4(127, 0, 0, 1);
let six = IpAddrKind::V6(String::from("::1"));
구조체를 값으로 지정할 수도 있음. 이 방법으로 여러 값과 다양한 형태를 정의할 수 있음.
struct Ipv4Addr {
}
struct Ipv6Addr {
}
enum IpAddrKind {
V4(Ipv4Addr),
V6(Ipv6Addr)
}
아래는 enum 을 정의하는 다양한 방법.
enum Message {
Quit,
Move {x: i32, y:i32},
Write(String),
ChangeColor(i32, i32, i32),
}
- Quit: 아무 데이터도 없는 형태.
- Move: 익명 구조체 형태.
- Write: String 타입의 값을 가지는 형태.
- ChangeColor: i32 타입의 값 3개를 가지는 형태.
각각 아래와 같이 선언. 각 변수는 모두 Message 타입이 됨.
let message_quit = Message::Quit;
let message_move = Message::Move{x: 30, y: 108};
let message_write = Message::Write(String::from("hello"));
let message_cc = Message::ChangeColor(253, 253, 253);
이런 enum 의 형태는 구조체로 치면 아래와 같음.
struct QuitMessage;
struct MoveMessage {
x: i32,
y: i32,
}
struct WriteMessage(String);
struct ChangeColorMessage(i32, i32, i32);
그리고 구조체와 같은 방식으로 메서드를 정의할 수 있음.
impl Message {
fn call(&self) {
// do something..
}
}
let m = Message::Write(String::from("hello"));
m.call();
'Rust' 카테고리의 다른 글
Enum(match) (0) | 2018.02.21 |
---|---|
Enum(Option<T>) (0) | 2018.02.21 |
구조체(메서드) (0) | 2018.02.20 |
구조체(활용) (0) | 2018.02.20 |
구조체(기본) (0) | 2018.02.19 |