100 Exercises To Learn Rust - 5.7 Unwrap 풀기

문제

// TODO: `easy_ticket`은 title이 유효하지 않을 때 panic이 발생해야 합니다.
// description이 유효하지 않다면 "Description not provided"라는 기본 description을 사용합니다.
fn easy_ticket(title: String, description: String, status: Status) -> Ticket {
    todo!()
}

#[derive(Debug, PartialEq, Clone)]
struct Ticket {
    title: String,
    description: String,
    status: Status,
}

#[derive(Debug, PartialEq, Clone)]
enum Status {
    ToDo,
    InProgress { assigned_to: String },
    Done,
}

impl Ticket {
    pub fn new(title: String, description: String, status: Status) -> Result<Ticket, String> {
        if title.is_empty() {
            return Err("Title cannot be empty".to_string());
        }
        if title.len() > 50 {
            return Err("Title cannot be longer than 50 bytes".to_string());
        }
        if description.is_empty() {
            return Err("Description cannot be empty".to_string());
        }
        if description.len() > 500 {
            return Err("Description cannot be longer than 500 bytes".to_string());
        }

        Ok(Ticket {
            title,
            description,
            status,
        })
    }
}

 

풀이

fn easy_ticket(title: String, description: String, status: Status) -> Ticket {
    let default_desc = "Description not provided".to_string();
    if description.is_empty() || description.len() > 500 {
        Ticket::new(title, default_desc, status).unwrap()
    } else {
        Ticket::new(title, description, status).unwrap()
    }
}

 

"Description not provided"를 담고 있는 기본 설명 default_desc를 정의해두고,

description이 유효하지 않은 경우에는 default_desc를, 유효한 경우에는 매개변수로 받은 description을 사용하도록 한다.

 

Ticket::new()Result 타입으로 Ok() 또는 Err()을 반환한다. 이 자체로는 무언가를 할 수 없다. 필요한 값은 Ok(), Err()로 감싸져 있다(wrapped)고 볼 수 있다. 이 값을 사용하려면 unwrap()이나 expect()로 꺼내야 한다.

 

둘 다 역할은 비슷하지만 expect()panic! 메시지를 직접 설정할 수 있다.