기본값 제공하기: unwrap_or
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 40번째.
.unwrap()와 .expect()는 Option에서 값을 추출할 수 있지만, 이 둘은 모두 큰 결함이 있습니다. 바로 None을 만났을 때 패닉(panic)을 발생시킨다는 점입니다. 더 안전한 코드를 위해 Rust는 절대 패닉을 발생시키지 않는 메서드인 .unwrap_or()를 제공합니다.
.unwrap_or() 메서드는 기본값을 인자로 받습니다. Option이 Some을 포함하고 있으면 내부 값을 반환합니다. None인 경우에는 제공된 기본값을 반환합니다:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
println!("Score: {}", score); // 출력: Score: 85
let no_score: Option = None;
let default_score = no_score.unwrap_or(0);
println!("Score: {}", default_score); // 출력: Score: 0이 방식은 .unwrap()보다 훨씬 안전합니다. 프로그램이 절대 충돌하지 않으며, 항상 사용할 수 있는 값을 반환받기 때문입니다.
챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 점수(숫자)이고, 두 번째 입력은 점수의 가용 여부(yes 또는 no)를 나타냅니다. 가용성 상태에 따라 Option<i32>를 생성하세요. .unwrap_or()를 사용하여 기본값 50으로 점수를 안전하게 추출한 다음, 최종 점수를 출력하세요.
요구 사항:
- 첫 번째 입력(점수)을 읽고 공백을 제거합니다.
- 첫 번째 입력을
i32로 파싱합니다. - 두 번째 입력(가용성 상태)을 읽고 공백을 제거합니다.
Option<i32>변수를 생성합니다:- 가용성 상태가
yes이면,Some(score)를 할당합니다. - 가용성 상태가
no이면,None을 할당합니다.
- 가용성 상태가
.unwrap_or(50)를 사용하여 기본값50으로 점수를 추출합니다.- 최종 점수를
Final score: [score]형식으로 출력합니다.
입력:
- 첫 번째 줄: 점수를 나타내는 숫자 (예:
85) - 두 번째 줄:
yes또는no
출력:
- 가용성 상태가
yes인 경우:Final score: [score](실제 점수) - 가용성 상태가
no인 경우:Final score: 50(기본값)
치트 시트
.unwrap_or() 메서드는 패닉(panic)을 발생시키지 않고 Option에서 값을 추출하는 안전한 방법을 제공합니다. 이 메서드는 기본값을 인자로 받으며, Some인 경우 내부 값을 반환하고, None인 경우 기본값을 반환합니다:
let maybe_score = Some(85);
let score = maybe_score.unwrap_or(0);
// score는 85입니다
let no_score: Option<i32> = None;
let default_score = no_score.unwrap_or(0);
// default_score는 0입니다이 메서드는 패닉을 유발하지 않으므로 .unwrap() 또는 .expect()보다 안전합니다. 항상 사용할 수 있는 값을 받게 됩니다.
직접 해보기
use std::io;
fn main() {
// 점수 읽기
let mut score_input = String::new();
io::stdin().read_line(&mut score_input).expect("Failed to read line");
let score: i32 = score_input.trim().parse().expect("Invalid number");
// 가용성 상태 읽기
let mut availability = String::new();
io::stdin().read_line(&mut availability).expect("Failed to read line");
let availability = availability.trim();
// TODO: 아래에 코드를 작성하세요
// 가용성 상태에 따라 Option<i32> 생성
// .unwrap_or(50)을 사용하여 최종 점수 가져오기
// 결과 출력
println!("Final score: {}", final_score);
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Logic & Flow의 모든 레슨
6'Option'으로 값이 없는 경우 처리하기
'Option'이란 무엇인가요?'Option'과 함께 'match' 사용하기is_some()과 is_none()'Option' 언래핑하기expect 메서드기본값 제공하기: unwrap_or요약 - 요소 찾기