
98
이펙티브 러스트
이렇게 모두 소비하는 동작
all
-
consuming
behavior
은 이해하기는 쉽지만 바람직하지 않은 경우가 많
다. 그래서 반복한 항목에 대해 대여
borrow
와 같은 동작이 필요하다.
이러한 동작을 명확히 하기 위해 예제는
Copy
(아이템
10
)를 구현하지 않은
Thing
타입을 사
용한다.
Copy
를 구현하면 소유권 문제(아이템
15
)가 숨겨지기 때문이다. 컴파일러가 알아서
모든 곳에 복사본을 생성한다.
// 일부러 `Copy`를 구현하지 않음
#[derive(Clone, Debug, Eq, PartialEq)]
struct Thing(u64);
let collection = vec![Thing(0), Thing(1), Thing(2), Thing(3)];
반복 대상 컬렉션 앞에
&
를 붙인다.
for item in &collection {
println!("{}", item.0);
}
println!("collection still around {collection:?}");
그러면 러스트 컴파일러는
&
Collection
타입에 대한
IntoIterator
구현을 찾는다. 제대로
설계된 컬렉션 타입이라면 이 구현을 제공할 것이다. 구현에서 여전히
Self
를 소비하겠지만,
이제부터
Self
타입은
Collection
이 아닌
&
Collection ...