自从
IntoIterator
特性的关联类型IntoIter
实现了Iterator
特性,那么难道不足以推断出关联类型Item
吗?IntoIter
,那么很快就会变得繁琐。where I: IntoIterator<IntoIter = ...>
where I: IntoIterator<Item = ...>
让我们考虑一个随机的例子,比如 print_strings
。在此之前,你需要像这样做:
fn print_strings<I, T>(iter: I)
where
I: IntoIterator<IntoIter = T>,
T: Iterator<Item = &'static str>,
{
for s in iter {
println!("{}", s);
}
}
而现在可以简化为:
fn print_strings<I>(iter: I)
where
I: IntoIterator<Item = &'static str>,
{
for s in iter {
println!("{}", s);
}
}
fn main() {
print_strings(vec!["foo", "bar", "baz"]);
}
IntoIterator
特性时,你确实需要type Item
声明,尽管它是多余的,因为它与<Self::IntoIter as Iterator>::Item
是相同的。(至少在关联类型默认值稳定之前不是可选的。)在特性约束中是不需要的,当然,这对于任何关联类型都是如此,无论多余与否。 - FrxstremIntoIterator
时不需要type Item
,而现在当然需要了。我的意思是,它的引入并不是因为IntoIterator
本身存在问题,而是为了简化where子句。 :) - vallentin
IntoIterator
有一个type Item
,当这个信息可以从type IntoIter
中获得。 - vallentinIntoIter
关联类型。 - L. F.