100 Exercises To Learn Rust - 3.7 setter 풀기

// TODO: Ticket 구조체의 각 필드에 대여-가변 설정자(&mut-setter)를 추가하세요.
//   `Ticket::new`와 동일한 조건을 준수하세요.
//   동일한 로직을 추출해 재사용하면 더 좋습니다.
//   비공개(private) 함수나 비공개 정적(static) 메서드를 사용할 수 있습니다.

풀이:

impl Ticket {
    pub fn new(title: String, description: String, status: String) -> Ticket {
        //조건 검사 로직은 필드 별로 분리
        check_title(&title);
        check_description(&description);
        check_status(&status);

        Ticket {
            title,
            description,
            status,
        }
    }

    pub fn title(&self) -> &String {
        &self.title
    }

    pub fn description(&self) -> &String {
        &self.description
    }

    pub fn status(&self) -> &String {
        &self.status
    }

    //setter 생성
    pub fn set_title(&mut self, title: String) {
        check_title(&title);
        self.title = title
    }
    pub fn set_description(&mut self, description: String) {
        check_description(&description);
        self.description = description
    }
    pub fn set_status(&mut self, status: String) {
        check_status(&status);
        self.status = status
    }
}

fn check_title(title: &String) {
    if title.is_empty() {
        panic!("Title cannot be empty");
    }
    if title.len() > 50 {
        panic!("Title cannot be longer than 50 bytes");
    }
}

fn check_description(description: &String) {
    if description.is_empty() {
        panic!("Description cannot be empty");
    }
    if description.len() > 500 {
        panic!("Description cannot be longer than 500 bytes");
    }
}
fn check_status(status: &String) {
    if status != "To-Do" && status != "In Progress" && status != "Done" {
        panic!("Only `To-Do`, `In Progress`, and `Done` statuses are allowed");
    }
}

 

setter로 필드를 수정할 때 역시 인스턴스를 생성할 때와 마찬가지로 조건을 검사해야 한다.

 

기존 new() 함수는 모든 필드의 조건을 한 번에 검사하고 있었으므로, 이를 필드 별로 분리하여 3개의 check_() 함수를 생성하여 new()와 각 setter에 사용했다.

 

setter에서는 &mut self로 인스턴스를 가변으로 대여하여, 조건을 검사한 후 새로운 값으로 대입한다.