16.3.1 map for Result

이전 예제에서 panic이 발생하면 우리에게 도움이 되지 않는 에러 메시지를 주게된다. 이런 경우를 피하려면, 우리는 리턴 타입을 더 상세히 할 필요가 있다. 여기 정규 요소인 i32이 있다.

Err 타입을 정의하기 위해, 우리는 parse()를 살펴볼텐데, 이는 FromStr trait을 i32에 구현해놨다. 그 결과, Err 타입은 [ParseIntError][Parse int error]로 명확해진다.

아래의 예제에서, 직선적인 match문 코드가 전반적으로 더 다루기 힘들게 만든다. 운이 좋게도, Optionmap메소드는 Result 용으로 구현된 많은 연결자 중에 하나이다. enum.Result에는 전체 목록이 들어있다.

use std::num::ParseIntError;

// 반환 타입이 재작성 되면, 우리는 `unwrap()`없이 패턴 매칭을 사용한다.
fn double_number(number_str: &str) -> Result<i32, ParseIntError> {
    match number_str.parse::<i32>() {
        Ok(n)  => Ok(2 * n),
        Err(e) => Err(e),
    }
}

// `Option`처럼, `map()`같은 연결자를 사용할 수 있다.
// 이 함수는 앞의 것과 유사하지만 다르게 읽힌다:
// 값이 유효한 경우 n을 수정하고, 그렇지 않으면 에러를 전달한다.
fn double_number_map(number_str: &str) -> Result<i32, ParseIntError> {
    number_str.parse::<i32>().map(|n| 2 * n)
}

fn print(result: Result<i32, ParseIntError>) {
    match result {
        Ok(n)  => println!("n is {}", n),
        Err(e) => println!("Error: {}", e),
    }
}

fn main() {
    // 여전히 합리적인 답을 표현한다.
    let twenty = double_number("10");
    print(twenty);

    // 다음은 이제 더 유용한 에러 메시지를 출력하게 된다.
    let tt = double_number_map("t");
    print(tt);
}

results matching ""

    No results matching ""