【问题标题】:Why doesn't Vec implement the Iterator trait?为什么 Vec 不实现 Iterator 特征?
【发布时间】:2020-03-02 15:48:06
【问题描述】:

Vec 没有实现 Iterator 特征的设计原因是什么?必须始终在所有向量和切片上调用 iter() 会导致代码行更长。

例子:

let rx = xs.iter().zip(ys.iter());

与 Scala 相比:

val rx = xs.zip(ys)

【问题讨论】:

标签: rust


【解决方案1】:

迭代器具有迭代状态。它必须知道下一个要给你的元素是什么。

因此,向量本身不是迭代器,区别很重要。您可以在同一个向量上拥有两个迭代器,例如,每个迭代器都有其特定的迭代状态。

但是向量可以为你提供一个迭代器,这就是它实现IntoIterator的原因,它可以让你这样写:

let v = vec![1, 4];
for a in v {
    dbg!(a);
}

许多函数在需要迭代器时采用IntoIteratorzip 就是这种情况,这就是原因

let rx = xs.iter().zip(ys.iter());

可以替换为

let rx = xs.iter().zip(ys);

【讨论】:

  • 很好的答案!我现在唯一想知道的是:为什么 xs.zip(ys) 在 Scala 中工作呢? Scala 中是否自动创建了迭代器(状态)?还是它的“列表类型”总是包含迭代器状态?无论 Scala 使用什么解决方案:为什么 Rust 不使用它?
  • @DenysSéguret 因为在 Rust 中,iter()into_iter()iter_mut() 之间的区别很重要。
  • @DenysSéguret 你是对的。我想说只为不可变迭代启用它(使用iter),并且需要显式调用iter_mut 以进行可变迭代。
  • 注意xs.iter().zip (ys)中的ys可以做同样的论证:你如何选择使用ys.iter()ys.iter_mut()
  • 对于ys,我们使用into_iter。原因很简单:ys 被消费了,所以其他迭代器类型没有意义。
【解决方案2】:

Vec 没有实现 Iterator 特征的设计原因是什么?

它应该实现三个迭代器中的哪一个?您可以从Vec 获得三种不同类型的迭代器:

  1. vec.iter()Iterator<Item = &T>
  2. vec.iter_mut() 给出Iterator<Item = &mut T> 并修改向量和
  3. vec.into_iter() 提供Iterator<Item = T> 并在过程中消耗向量。

与 Scala 相比:

在 Scala 中它也没有直接实现Iterator,因为Iterator 需要向量本身没有的下一项指针。然而,由于 Scala 没有移动语义,它只有一种从向量创建迭代器的方法,所以它可以隐式地进行转换。 Rust 有三种方法,所以它必须问你想要哪一种。

【讨论】:

  • into_iter() 是消耗向量的那个; drain 的不同之处在于它只清空向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多