【问题标题】:Why does the IntoIterator trait require explicitly specifying the associated type Item?为什么 IntoIterator 特征需要显式指定关联类型 Item?
【发布时间】:2021-04-03 19:38:57
【问题描述】:

既然IntoIterator trait 的关联类型IntoIter 实现了Iterator trait,还不足以推断出关联类型Item

【问题讨论】:

  • @L.F.当信息可以type IntoIter获得时,OP 询问为什么IntoIteratortype Item
  • @vallentin 抱歉,我没有意识到它指的是 IntoIter 关联类型。

标签: rust iterator traits


【解决方案1】:

为什么IntoIterator trait 需要明确的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"]);
}

【讨论】:

  • 嗯,我不认为你答案的第一部分是正确的,因为你在实现 IntoIterator 特征时确实需要 type Item 声明,它不是可选尽管是多余的,因为它与&lt;Self::IntoIter as Iterator&gt;::Item 相同。 (至少在关联类型默认值稳定之前不会。)在 trait bound 中你不需要它,当然,但任何关联类型都是如此,无论是否冗余。
  • 我的意思是 type Item 中的“冗余”之前不需要实现 IntoIterator,现在当然可以了。我的意思是由于IntoIterator 本身的问题而没有引入它。而是引入以简化 where 子句。 :)
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2020-04-09
相关资源
最近更新 更多