and then sum()
knows to return an i32
여기가 잘못되었습니다. Iterator::sum
를 체크 아웃 :
fn sum<S>(self) -> S
where S: Sum<Self::Item>
을 그것은 Sum
을 구현하는 제네릭 형식 S
을 반환합니다. S
은 Self::Item
과 일치해야합니다. 따라서 컴파일러에서는 합계 할 형식을 으로 지정해야합니다.
왜 유용합니까? 표준 라이브러리에서 다음 두 샘플 구현을 확인하십시오.
impl Sum<i8> for i8
impl<'a> Sum<&'a i8> for i8
맞아요! 반복자 u8
또는의 반복자와 &u8
의 반복자를 합칠 수 있습니다. 우리는이를 가지고 있지 않은 경우,이 코드는 작동하지 않을 것이다 :
fn main() {
let a: i32 = (0..5).sum();
let b: i32 = [0, 1, 2, 3, 4].iter().sum();
assert_eq!(a, b);
}
As bluss points out
, 우리는
u8 -> u8
및
&'a u8 -> u8
넥타이 것 인
관련된 유형을함으로써 이러한 목표를 달성 할 수있다.
관련 유형 만있는 경우 대상 합계 유형이 항상 고정되어 유연성이 떨어집니다. 예를 들어 Sum
을 자체 유형으로 구현할 수도 있습니다.
여기에 u8
초를 합산했지만 합계 유형이 증가합니다. 합계가 u8
을 초과 할 가능성이 있습니다.
#[derive(Debug, Copy, Clone)]
struct Points(i32);
impl std::iter::Sum<u8> for Points {
fn sum<I>(iter: I) -> Points
where I: Iterator<Item = u8>
{
let mut pts = Points(0);
for v in iter {
pts.0 += v as i32;
}
pts
}
}
fn main() {
let total: Points = (0u8..42u8).sum();
println!("{:?}", total);
}
관련 질문 : http : // stackoverflow.com/q/40243061/1233251 –