Rust의 함수 결과 처리 3 - 주의

mohadang·2023년 1월 21일
0

Rust

목록 보기
4/30
post-thumbnail

is_none, is_some, is_ok, is_error

rust를 이용하여 전통적인 방식으로 None 검사가 가능 하긴 하다.

struct MyBag<T> {
    item: Option<T>,
}

fn main() {
    let bag = MyBag::<i32> { item: None };
    if bag.item.is_none() {
        println!("Not exises");
    }

    if !bag.item.is_some() {
        println!("Not found something");
    }

    match bag.item {
        Some(v) => println!("Found {}!", v),
        None => println!("Nothing"),
    }
}

간단히 값이 있는지 없는지 검사만 한다면 문제가 없을 듯 하다. 하지만 이를 활용하여 unwarp으로 처리 하는 악용 사례가 발생 할 수 있을 것이다.

unwarp

unwrap은 Option/Result 내부의 값을 꺼내온다. 만약 enum의 값이 None/Err인 상태에서 unwrap을 호출할 경우 panic!이 발생한다. 이를 피하기 위해 is_some, is_none으로 먼저 검사가 필요할 것이다.

struct MyBag<T> {
    item: Option<T>,
}

fn main() {
    let bag = MyBag::<i32> { item: Some(32i32) };
    //let bag = MyBag::<i32> { item: None };
    if !bag.item.is_some() {
        let v = bag.item.unwrap();
        println!("found something {v}");
    }
}

작성된 코드는 전통적인 null 검사와 다를것이 없어 보인다. is_none, is_some을 사용 하더라도 unwarp()을 사용하는 것은 지양해야 할 것 같다.

빠르게 디버깅 해야 할 경우에는 Option/Result를 쓰는 것은 귀찮은 일일 수 있다.
이럴때 unwarp이라는 함수를 사용하면 빠르지만 위험한 방식으로 값을 가져올 수 있을 것이다.

profile
mohadang

0개의 댓글