and then sum()
knows to return an i32
這是你出錯的地方。退房Iterator::sum
:
fn sum<S>(self) -> S
where S: Sum<Self::Item>
它返回一個泛型類型S
它必須實現Sum
。 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
s,但增加我們正在求和的類型的大小,因爲它的總和可能會超過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 –