-> Result<(), std::fmt::Error> {
write!(f, "id: {}", self.0)
}
}
impl std::fmt::Debug for Question {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>)
-> Result<(), std::fmt::Error> {
write!(f, "{:?}", self.tags)
}
}
...
Debug 트레이트의 구현은 Display 트레이트와 매우 닮았다. 여기에서는 write! 매크로에 {} 대신 {:?}를 사용한 것만 다르다. 사용자 정의 타입을 구현하고 표시할 때마다 이 코드를 모두 작성하는 것은 상당히 번거로운 일이다.
러스트 표준 라이브러리의 derive라는 절차적 매크로를 사용하면 이런 번거로운 문제를 해결할 수 있다. #[derive] 애너테이션을 구조체 정의 위에 놓기만 하면 된다. Display 트레이트에 대한 문서에서도 중요한 사실을 알 수 있다. 문서에는 ‘Display는 Debug와 유사하지만, Display는 사용자가 보기 위한 출력용이므로 파생(derive)될 수 없다’라는 내용이 있다.