Menu
Coddy logo textTech

단축 방법: unwrap과 expect

Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 45번째.

이미 Option과 함께 .unwrap().expect()에 대해 배웠으며, 이와 동일한 메서드들이 Result에서도 작동합니다. 하지만 성공과 실패 사례를 다룰 때 그 동작은 약간 다릅니다.

.unwrap() 메서드는 Ok 변형에서 값을 추출하지만, 만약 ResultErr인 경우 프로그램은 패닉(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!

이러한 메서드들은 성공적인 값에 빠르게 접근할 수 있게 해주지만, 주의해서 사용해야 합니다. 이 메서드들은 작업이 성공할 것이라고 절대적으로 확신할 때나, 개발 및 테스트 중에 가장 적합합니다.

challenge icon

챌린지

쉬움

두 개의 입력을 받게 됩니다. 첫 번째 입력은 숫자(문자열 형태)이고, 두 번째 입력은 상태 표시자(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에서 값을 추출하지만, ResultErr인 경우 패닉을 발생시킵니다:

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!"); // 사용자 정의 메시지와 함께 패닉 발생

이러한 메서드들은 ResultErr인 경우 프로그램을 중단시키므로 주의해서 사용해야 합니다. 작업이 성공할 것이라고 확신할 때나 개발 및 테스트 중에 사용하는 것이 가장 적합합니다.

직접 해보기

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]
    
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨