16.3.1 map
for Result
이전 예제에서 panic이 발생하면 우리에게 도움이 되지 않는 에러 메시지를 주게된다. 이런 경우를 피하려면, 우리는 리턴 타입을 더 상세히 할 필요가 있다. 여기 정규 요소인 i32
이 있다.
Err
타입을 정의하기 위해, 우리는 parse()
를 살펴볼텐데, 이는 FromStr
trait을 i32
에 구현해놨다. 그 결과, Err
타입은 [ParseIntError
][Parse int error]로 명확해진다.
아래의 예제에서, 직선적인 match
문 코드가 전반적으로 더 다루기 힘들게 만든다. 운이 좋게도, Option
의 map
메소드는 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); }