为什么IntoIteratortrait需要显式指定关联类型Item?
由于相关类型IntoIter的的IntoIterator特点,实现了Iterator特质,是不是有足够的推断关联的类型Item?
回答
为什么
IntoIterator特征需要显式type Item声明?
它没有。你是正确的,当你impl IntoIterator for ...再Item是多余的,并可能被通过获得IntoIter。
这是在PR #22313 中引入的。简而言之,引入的原因是为了简化 where 子句。如果您必须指定,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"]);
}