단축 방법: unwrap과 expect
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 45번째.
이미 Option과 함께 .unwrap() 및 .expect()에 대해 배웠으며, 이와 동일한 메서드들이 Result에서도 작동합니다. 하지만 성공과 실패 사례를 다룰 때 그 동작은 약간 다릅니다.
.unwrap() 메서드는 Ok 변형에서 값을 추출하지만, 만약 Result가 Err인 경우 프로그램은 패닉(panic)을 일으키고 종료됩니다. 이와 유사하게, .expect()도 동일한 작업을 수행하지만 디버깅을 더 쉽게 만들어주는 사용자 정의 패닉 메시지를 제공할 수 있게 해줍니다:
let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // Prints: Value: 42
// This would panic with the custom message:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // Panics!이러한 메서드들은 성공적인 값에 빠르게 접근할 수 있게 해주지만, 주의해서 사용해야 합니다. 이 메서드들은 작업이 성공할 것이라고 절대적으로 확신할 때나, 개발 및 테스트 중에 가장 적합합니다.
챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 숫자(문자열 형태)이고, 두 번째 입력은 상태 표시자(ok 또는 error)입니다. 상태에 따라 Result<i32, &'static str>를 생성하세요. 상태가 ok이면 파싱된 숫자를 포함하는 Ok를 생성합니다. 상태가 error이면 "Invalid operation"이라는 메시지를 담은 Err를 생성합니다. Result에서 값을 추출하기 위해 커스텀 메시지와 함께 .expect()를 사용하고 그 값을 출력하세요.
요구 사항:
- 첫 번째 입력(숫자)을 읽고 공백을 제거합니다.
- 첫 번째 입력을
i32로 파싱합니다. - 두 번째 입력(상태)을 읽고 공백을 제거합니다.
Result<i32, &'static str>변수를 생성합니다:- 상태가
ok이면,Ok(parsed_number)를 할당합니다. - 상태가
error이면,Err("Invalid operation")을 할당합니다.
- 상태가
Result에서 값을 추출하기 위해.expect("Failed to get value")를 사용합니다.- 추출된 값을
Value: [value]형식으로 출력합니다.
입력:
- 첫 번째 줄: 숫자 (예:
75) - 두 번째 줄:
ok또는error
출력:
- 상태가
ok인 경우:Value: [number] - 상태가
error인 경우: 프로그램이 커스텀 메시지와 함께 패닉(panic)을 발생시킵니다 (이 챌린지에서는 테스트되지 않음).
참고: 이 챌린지에서는 성공적인 실행을 보장하기 위해 테스트 케이스에서 ok 상태만 사용합니다. error 케이스는 Err를 만났을 때 .expect()의 예상된 동작인 패닉을 발생시킵니다.
치트 시트
.unwrap() 및 .expect() 메서드는 Result 타입과 함께 작동하여 Ok 변체에서 값을 추출합니다.
.unwrap()은 Ok에서 값을 추출하지만, Result가 Err인 경우 패닉을 발생시킵니다:
let success: Result<i32, &str> = Ok(42);
let value = success.unwrap();
println!("Value: {}", value); // 출력: Value: 42.expect()는 동일한 방식으로 작동하지만, 더 쉬운 디버깅을 위해 사용자 정의 패닉 메시지를 제공할 수 있게 해줍니다:
let success: Result<i32, &str> = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // 출력: Value: 42
// 이 코드는 사용자 정의 메시지와 함께 패닉을 발생시킵니다:
let failure: Result<i32, &str> = Err("Something went wrong");
let value = failure.expect("This should work!"); // 사용자 정의 메시지와 함께 패닉 발생이러한 메서드들은 Result가 Err인 경우 프로그램을 중단시키므로 주의해서 사용해야 합니다. 작업이 성공할 것이라고 확신할 때나 개발 및 테스트 중에 사용하는 것이 가장 적합합니다.
직접 해보기
use std::io;
fn main() {
// 첫 번째 입력(숫자)을 읽습니다.
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// 숫자를 i32 타입으로 파싱합니다.
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// 두 번째 입력(상태)을 읽습니다.
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: 아래에 코드를 작성하세요.
// 상태(status)에 따라 Result<i32, &'static str>를 생성하세요.
// .expect()를 사용하여 값을 추출하세요.
// 결과를 다음 형식으로 출력하세요: Value: [value]
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Logic & Flow의 모든 레슨
7'Result'를 이용한 에러 처리
'Result'란 무엇인가요?'Result'와 함께 'match' 사용하기is_ok()와 is_err()단축 방법: unwrap과 expect물음표 연산자 '?'문자열을 숫자로 파싱하기요약 - 안전한 나눗셈 함수