
138
이펙티브 러스트
확보해야 하는데,
Self
는 어떠한 타입도 될 수 있기 때문에
y
의 크기를 미리 알 수 없다. 따라
서
Self
가 들어간 반환 타입은 객체 안전을 충족할 수 없다.
7
두 번째 제약 조건에 한 가지 예외가 있다. 크기를 컴파일 타임에 알 수 있는 타입임을 명시하
는
Sized
마커 트레이트가 지정된
Self
라면,
Self
가 포함된 타입을 반환하는 메서드라도 객
체 안전성에 위배되지 않는다.
/// `Stamp`는 여러 번 복사해서 그릴 수 있다.
trait Stamp: Draw {
fn make_copy(&self) -> Self
where
Self: Sized;
}
let square = Square {
top_left: Point { x: 1, y: 2 },
size: 2,
};
// `Square`는 `Stamp`를 구현하므로, `make_copy()`를 호출할 수 있다.
let copy = square.make_copy();
// `Self`를 반환하는 메서드에는 `Sized` 트레이트 바운드가 있기 때문에,
// `Stamp` 트레이트 객체를 생성할 수 있다.
let stamp: &dyn Stamp = □
이렇게 트레이트 바운드가 지정되면 어차피 이 메서드를 트레이트 객체와 함께 사용할 수 없
다. 트레이트 객체는 본래 크기를 ...