Rust에서의 Unwrap 및 용도

Nilesh Katuwal 2022년6월7일
Rust에서의 Unwrap 및 용도

이 기사에서는 unwrap과 Rust에서의 사용법에 대해 설명합니다.

Rust의 ‘풀기’

Rust에서 unwrap이란 다음 명령을 실행하는 것을 의미합니다. “계산 결과를 보고 오류가 있으면 당황하고 프로그램을 중지합니다.” 언래핑은 매우 간단한 프로세스이므로 코드를 시연하는 것이 좋습니다.

그러나 그렇게 하기 전에 OptionResult 유형을 조사해야 합니다.

‘옵션’ 유형

Option 유형은 Rust의 유형 시스템을 사용하여 부재의 가능성을 표현하는 방법입니다. 부재 가능성을 형식 시스템에 인코딩하는 것은 컴파일러가 프로그래머가 부재를 처리하도록 강제하기 때문에 중요합니다.

부재가 가능한 경우 std 라이브러리의 Option<T>라는 enum이 사용됩니다. 두 가지 옵션 중 하나의 형태를 취합니다.

  1. Some(T) - T 유형의 요소가 식별되었습니다.
  2. 없음 - 요소가 감지되지 않았습니다.

이러한 상황은 match를 사용하여 명시적으로 또는 암시적으로 unwrap을 사용하여 처리할 수 있습니다. 암시적 처리는 내부 요소 또는 panics를 반환합니다.

통사론:

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

파일 이름 확장자를 찾는 예:

fn find(haystack: &str, words: char) -> Option<usize> { haystack.find(words) }
fn main() {
    let name_of_file = "file.doc";
    match find(name_of_file, '.') {
        None => println!("Extension could not be found."),
        Some(i) => println!("The extension of file is: {}", &name_of_file[i+1..]),
    }
}

출력:

The extension of file is: doc

panicexpect를 사용하여 수동으로 사용자 지정할 수 있지만 unwrap은 명시적 처리보다 관련성이 낮은 출력을 생성합니다. 아래 예에서 명시적 처리는 필요한 경우 패닉 옵션을 유지하면서 더 제어된 결과를 생성합니다.

fn adult_man(food: Option<&str>) {
    match food {
        Some("pasta") => println!("The food does not taste right."),
        Some(inner)   => println!("{}? It could be nice.", inner),
        None          => println!("No good food? Nevertheless."),
    }
}

fn food(food: Option<&str>) {
    let interior = food.unwrap();
    if interior == "pasta" { panic!("Ummmmmm!!!!"); }

    println!("I am glad to have {}s!!!!!", interior);
}

fn main() {
    let bruschetta  = Some("Bruschetta");
    let pasta = Some("pasta");
    let void  = None;

    adult_man(bruschetta);
    adult_man(pasta);
    adult_man(void);

    let spaghetti = Some("spaghetti");
    let nothing = None;

    food(spaghetti);
    food(nothing);
}

모든 음식은 첫 번째 위 코드에서 match를 사용하여 명시적으로 처리됩니다.

모든 음식은 섹션 기능에 unwrap을 사용하여 암시적으로 처리됩니다. Unwrapnone을 수신하면 panic을 반환합니다.

출력:

Bruschetta? It could be nice.
The food does not taste right.
No good food? Nevertheless.
I am glad to have spaghettis!!!!!

‘결과’ 유형

‘결과’는 ‘옵션’의 보다 강력한 버전입니다. 부재의 가능성을 표현하는 ‘Option’과 달리 ‘Result’는 오류 가능성을 표현한다.

오류는 일반적으로 계산 실행이 실패한 이유를 나타내는 데 사용됩니다. 이것은 옵션이라는 단어의 일반화된 형태입니다.

통사론:

enum Result<T, E> {
    Ok(T),
    Err(E),
}