expect 메서드
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 39번째.
.unwrap()가 작업을 수행하긴 하지만, 주요한 단점이 있습니다. None에서 패닉(panic)이 발생할 때 에러 메시지가 일반적이고 도움이 되지 않는다는 점입니다. 이럴 때 .expect()가 유용하게 사용됩니다.
.expect() 메서드는 .unwrap()과 정확히 동일하게 작동합니다. 즉, Some에서 값을 추출하고 None인 경우 패닉(panic)을 발생시킵니다. 주요 차이점은 .expect()를 사용하면 사용자 정의 패닉 메시지를 제공할 수 있다는 것입니다:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);Option이 Some을 포함하고 있다면, .expect()는 .unwrap()과 마찬가지로 내부 값을 반환합니다. 하지만 None인 경우, 일반적인 패닉 메시지 대신 사용자 정의 메시지가 표시되어 무엇이 어디서 잘못되었는지 훨씬 더 쉽게 이해할 수 있습니다.
챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 제품 이름이고, 두 번째 입력은 제품의 재고 유무(yes 또는 no)를 나타냅니다. 제품이 재고가 있는 경우 Some(product_name)을 포함하고, 재고가 없는 경우 None을 포함하는 Option<String>을 생성하세요. .expect()를 사용하여 설명적인 메시지와 함께 제품 이름을 추출하고 이를 출력하세요.
요구 사항:
- 첫 번째 입력(제품 이름)을 읽고 공백을 제거합니다.
- 두 번째 입력(재고 상태)을 읽고 공백을 제거합니다.
Option<String>변수를 생성합니다:- 재고 상태가
yes인 경우,Some(product_name.to_string())을 할당합니다. - 재고 상태가
no인 경우,None을 할당합니다.
- 재고 상태가
"Product should be in stock"이라는 메시지와 함께.expect()를 사용하여 제품 이름을 추출합니다.- 추출된 제품 이름을
Product available: [product_name]형식으로 출력합니다.
입력:
- 첫 번째 줄: 제품 이름 (예:
Laptop) - 두 번째 줄:
yes또는no
출력:
- 재고 상태가
yes인 경우:Product available: [product_name] - 재고 상태가
no인 경우: 프로그램은 커스텀 메시지 "Product should be in stock"과 함께 패닉(panic)을 발생시킵니다 (이것은 이 챌린지에서 의도된 동작입니다).
참고: 재고 상태가 no일 때, None에 대해 .expect()를 호출하면 커스텀 메시지와 함께 패닉이 발생합니다. 이는 .expect()가 .unwrap()에 비해 어떻게 더 유용한 오류 정보를 제공하는지 보여줍니다.
치트 시트
.expect() 메서드는 .unwrap()과 유사하게 작동하지만, 더 나은 에러 디버깅을 위해 사용자 정의 패닉 메시지를 제공할 수 있게 해줍니다.
Option에서 호출될 때:
Some을 포함하고 있으면, 내부 값을 반환합니다None을 포함하고 있으면, 사용자 정의 메시지와 함께 패닉이 발생합니다
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);사용자 정의 에러 메시지를 사용하면 코드의 어느 부분에서 무엇이 잘못되었는지 더 쉽게 식별할 수 있습니다.
직접 해보기
use std::io;
fn main() {
// 제품 이름 읽기
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// 재고 상태 읽기
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: 아래에 코드를 작성하세요
// stock_status를 기반으로 Option<String> 생성
// .expect()를 사용하여 제품 이름 추출
// 다음 형식으로 결과 출력: Product available: [product_name]
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.