본문 바로가기
개발/러스트 (Rust)

Rust 기본, 옵션 열거형 (Option enum)

by 레조 2024. 8. 17.

https://rustacean.net/

 

Rust 기본 : 옵션 열거형 (Option enum)

 

Rust에서 유효한 값을 반환하거나 아무 값도 반환하지 않으려면 

Option enum을 사용할 수 있습니다.

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


Option enum에는 두 가지 변형이 있습니다. 

하나는 일반적인 값을 포함하는 Some 변형이고, 

다른 하나는 None 변형입니다.

Option enum과 그 변형들은 std::prelude에 있습니다. 
std::prelude는 Rust가 모든 Rust 프로그램에 자동으로 가져오는 것들의 목록입니다.
따라서 추가 코드 없이도 이들을 사용할 수 있습니다.

std::prelude
https://doc.rust-lang.org/std/prelude/

 

std::prelude - Rust

§The Rust Prelude Rust comes with a variety of things in its standard library. However, if you had to manually import every single thing that you used, it would be very verbose. But importing a lot of things that a program never uses isn’t good either.

doc.rust-lang.org

 


 

Option 사용하기.

fn main() {
    let username = get_username(1);
    
    match username.clone() {
        Some(name) => println!("{name}"),
        None => {}
    }

    // match expression 중에서 
    // 하나만 사용하고 다른 경우는 버리고 싶다면 if let 사용한다.    
    // Some
    if let Some(name) = username.clone() {
        println!("{name}");
    }
    // None
    if let None = username {
        println!("Hello World");
    }

    // if let Some - match 활용
    let my_color = Some(String::from("red"));
    
    if let Some(colorname) = my_color {
        match colorname.as_str() {
            "red" => println!("The color is {}", colorname),
            "green" => println!("The color is green"),
            "blue" => println!("The color is blue"),
            _ => println!("Unknown color"),
        }
    }
}

fn get_username(user_id: u32) -> Option<String> {
    let db_result = String::from("codeself");

    if user_id == 1 {
        Some(db_result)
    } else {
        None
    }
}


Point 구조체를 Option으로 감싸기.

struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let y: Option<Point> = Some(Point { x: 100, y: 200 });

    match &y { // 참조(&), 클론(clone()), 값(y)으로 사용했을 경우 소유권 변화를 생각해보자.
        Some(p) => println!("Co-ordinates are {},{}", p.x, p.y),
        _ => println!("no match"),
    }
    y;
}


배열을 전달하여 Option으로 리턴하기.

fn last_element(nums: &[i32]) -> Option<i32> {
    if nums.len() > 0 {
        Some(nums[nums.len() - 1])
    } else {
        None
    }
}

fn main() {
    let my_nums = [1, 1, 2, 3, 5, 8, 13];
    match last_element(&my_nums) {
        Some(ele) => println!("Last element: {ele}"),
        None => println!("Empty array")
    }
}