열거형
열거형 정의하기
enum IpAddrKind {
V4,
V6,
}
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
열거형 Variant 에 값을 지정하기
enum IpAddr {
V4(String),
V6(String),
}
let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
- 열거형 배리언트에 데이터를 직접 붙힐수 있다.
- 한개 이상의 값을 가질수도 있다.
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
struct Ipv4Addr {
// --생략--
}
struct Ipv6Addr {
// --생략--
}
enum IpAddr {
V4(Ipv4Addr),
V6(Ipv6Addr),
}
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
Option 열거형
enum Option<T> {
None,
Some(T),
}
let some_number = Some(5);
let some_char = Some('e');
let absent_number: Option<i32> = None;
Match 제어 흐름
- 일련의 패턴과 어떤 값을 비교하고 매칭 기반으로 코드를 수행한다.
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
값을 바인딩 하는 패턴
#[derive(Debug)] // so we can inspect the state in a minute
enum UsState {
Alabama,
Alaska,
// --생략--
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
// Quarter 에 값이 바인딩 되어 있다.
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
// 패턴을 이용해 값을 가져온다.
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
}
}
}
Option 의 값을 가져오는 예시
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
// Some 일 경우 1을 더해 리턴한다.
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
- 단 match를 사용할 경우 모든 case를 전부 작성해야 한다.
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
Some(i) => Some(i + 1),
}
}
// None 에 대한 케이스가 없어 에러가 발생한다.
포괄패턴
let dice_roll = 9;
match dice_roll {
3 => add_fancy_hat(),
7 => remove_fancy_hat(),
other => move_player(other),
}
fn add_fancy_hat() {}
fn remove_fancy_hat() {}
fn move_player(num_spaces: u8) {}
- other 은 3 과 7이 아닌 모든 경우의 패턴이다.
let dice_roll = 9;
match dice_roll {
3 => add_fancy_hat(),
7 => remove_fancy_hat(),
_ => (),
}
fn add_fancy_hat() {}
fn remove_fancy_hat() {}
- 포괄턴의 값을 사용할 필요가 없는 경우는 _ 를 쓸수 있다.
if let 흐름
let config_max = Some(3u8);
if let Some(max) = config_max {
println!("The maximum is configured to be {}", max);
}
- 어떤값이 Some일 때에만 코드를 실행하게 한다.
- 다른경우는 무시된다.
let mut count = 0;
if let Coin::Quarter(state) = coin {
println!("State quarter from {:?}!", state);
} else {
count += 1;
}
- 다른 경우를 처리하는 예시, else 를 사용한다.