
70
이펙티브 러스트
컴파일러가 알려 주기 때문에 간단히 해결할 수 있다. 그보다 더 큰 문제는 내부 타입에 대한
트레이트 구현이 사라진다는 것이다. 뉴타입은 말그대로 새로운 타입이므로 기존 내부 구현이
적용되지 않는다.
파생 가능한
derivable
트레이트를 뉴타입으로 선언하면 수많은
derive
구문으로 뒤덮인다.
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
pub struct NewType(InnerType);
그런데 좀 더 정교한 트레이트에서 내부 타입에 대한 구현을 복구하려면 이를 포워딩
forwarding
하
기 위한 보일러플레이트 코드가 필요하다. 예를 들면 다음과 같다.
use std::fmt;
impl fmt::Display for NewType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
self.0.fmt(f)
}
}
아이템
7
: 복잡한 타입에는 빌더를 적용하라
이번에는 복잡한 데이터 구조체의 인스턴스를 쉽게 생성할 수 있도록 빌더
builder
타입을 함께 지
정하는 빌더 패턴을 알아본다.
러스트에서 구조체의 인스턴스를 생성하려면 필드를 모두 채워야 한다. 이처럼 초기화되지 않
은 값이 존재할 수 없기 때문에 ...