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를 통해 상호 변환 가능하므로 사용 가능하다.