100 Exercises To Learn Rust - 4.7 deref 풀기

Deref

4.6에서 &String&str로 변경하는 것만으로 타입을 변경할 수 있었는데, 타입 변환이 엄격한 러스트의 특성을 생각하보면 이상한 일이다.

 

이런 변환이 가능한 이뉴는 Deref 때문이다.

 

어떤 타입 T가 Target U에 대해 Deref 트레이트를 구현했다면, &T&U는 상호변환이 가능(interchangable)하다.

 

impl Deref for String {
    type Target = str;

    fn deref(&self) -> &str {
        // [...]
    }
}

 

String은 위와 같이 str 타입에 대해 Deref 트레이트를 구현했기 때문에 서로 변환이 가능하다.

문제

// TODO: title과 description이 접근자를 통해 반환되면, 정규화되어야(normalized) 합니다.
// 예를 들어, 문자열 앞과 뒤의 공백은 제거되어야 합니다.
// 러스트에는 이를 도울 수 있는 표준 라이브러리 메서드가 있지만, String의 문서에서는 찾을 수 없죠.
// 그것이 어디에 있고 어떻게 사용하는지 찾을 수 있나요?


pub struct Ticket {
    title: String,
    description: String,
    status: String,
}

impl Ticket {
    pub fn title(&self) -> &str {
        todo!()
    }

    pub fn description(&self) -> &str {
        todo!()
    }
}

풀이

impl Ticket {
    pub fn title(&self) -> &str {
        self.title.trim()
    }

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

 

프로그래밍 경험이 있다면 공백 제거는 trim()일 것이라고 추측할 수 있다.

 

trim은 String의 메서드가 아니라 str의 메서드지만 Deref를 통해 상호 변환 가능하므로 사용 가능하다.