ExactSizeIterator
ExactSizeIterator (정확한 길이를 아는 반복자 트레이트)
자신의 정확한 반복 횟수를 아는 반복자를 위한 트레이트예요. len()으로 남은 요소 개수를 정확히 알 수 있어요.
출처: Rust 공식 문서
본문
많은 Iterator는 몇 번 반복할지 모르지만, 어떤 것들은 정확히 알고 있어요. 반복자가 정확한 반복 횟수를 안다면 그 정보에 접근할 수 있게 해 주는 것이 유용해요. 예를 들어 역방향으로 반복하고 싶다면 끝이 어디인지 아는 것이 좋은 출발점이에요.
ExactSizeIterator를 구현할 때는 반드시 Iterator도 함께 구현해야 해요. 이때 Iterator::size_hint의 구현은 반드시 반복자의 정확한 크기를 반환해야 해요.
len 메서드는 기본 구현이 있어서 보통 직접 구현하지 않아도 돼요. 다만 기본 구현보다 더 성능 좋은 구현을 제공할 수 있다면 이 경우 오버라이딩하는 것이 합리적이에요.
이 트레이트는 안전(safe)한 트레이트이며, 따라서 반환되는 길이가 정확하다는 것을 보장하지는 않고 보장할 수도 없어요. 즉 unsafe 코드는 Iterator::size_hint의 정확성을 의존해서는 안 돼요. 추가로 이 보장을 제공하는 것은 불안정한 unsafe 트레이트인 TrustedLen이에요.
어떤 어댑터는 ExactSizeIterator가 되면 안 되나요?
어댑터가 반복자를 더 길게 만든다면, 그 어댑터가 ExactSizeIterator를 구현하는 것은 보통 잘못된 일이에요. 내부의 정확한 크기를 가진 반복자가 이미 usize::MAX 길이일 수 있고, 그러면 더 길어진 어댑티드 반복자의 길이는 usize로 정확히 표현할 수 없게 돼요. 그래서 A와 B가 모두 ExactSizeIterator여도 Chain은 ExactSizeIterator가 아니에요.
시그니처는 다음과 같아요.
pub trait ExactSizeIterator: Iterator {
// 제공되는 메서드
fn len(&self) -> usize { ... }
fn is_empty(&self) -> bool { ... }
}
예시
기본 사용법:
// 유한한 범위는 정확히 몇 번 반복할지 안다
let five = 0..5;
assert_eq!(5, five.len());