为什么`FromIterator`的实现使用`IntoIterator`而不是`Iterator`?

时间:2018-02-25 18:59:39

标签: iterator rust

[{3}}中FromIterator特征的示例实现是:

impl FromIterator<i32> for MyCollection {
    fn from_iter<I: IntoIterator<Item=i32>>(iter: I) -> Self {
        let mut c = MyCollection::new();

        for i in iter {
            c.add(i);
        }

        c
    }
}

FromIterator定义了如何从迭代器创建类型。 from_iter的签名需要一个实现IntoIterator的类型,该类型定义了如何将类型转换为Iterator

from_iter是这样定义的,因为IntoIterator并不像Iterator那样严格要求吗?

1 个答案:

答案 0 :(得分:2)

  

from_iter是这样定义的,因为IntoIterator并不像Iterator那样严格要求吗?

IntoIterator会自动为Iterator实施,因此实施IntoIterator的类型集是实施Iterator的超集。

在制作通用功能时,最好尽量减少其要求,即尽量使其尽可能通用。

当然,需要在以下方面进行权衡:

  • 易用性:使用尽可能多的类型,
  • 易于实施

对于孤立代码库中的单独功能,可能不值得为易用性进行优化;对于标准库中的特征/功能,由于用户数远远超过开发者(这个特定部分)的数量,因此权衡强烈支持易用性。

由于从IntoIterator转到Iterator非常简单,因此对实施并不重要,因此可以轻松打电话。