【发布时间】:2020-03-02 15:48:06
【问题描述】:
Vec 没有实现 Iterator 特征的设计原因是什么?必须始终在所有向量和切片上调用 iter() 会导致代码行更长。
例子:
let rx = xs.iter().zip(ys.iter());
与 Scala 相比:
val rx = xs.zip(ys)
【问题讨论】:
标签: rust
Vec 没有实现 Iterator 特征的设计原因是什么?必须始终在所有向量和切片上调用 iter() 会导致代码行更长。
例子:
let rx = xs.iter().zip(ys.iter());
与 Scala 相比:
val rx = xs.zip(ys)
【问题讨论】:
标签: rust
迭代器具有迭代状态。它必须知道下一个要给你的元素是什么。
因此,向量本身不是迭代器,区别很重要。您可以在同一个向量上拥有两个迭代器,例如,每个迭代器都有其特定的迭代状态。
但是向量可以为你提供一个迭代器,这就是它实现IntoIterator的原因,它可以让你这样写:
let v = vec![1, 4];
for a in v {
dbg!(a);
}
许多函数在需要迭代器时采用IntoIterator,zip 就是这种情况,这就是原因
let rx = xs.iter().zip(ys.iter());
可以替换为
let rx = xs.iter().zip(ys);
【讨论】:
xs.zip(ys) 在 Scala 中工作呢? Scala 中是否自动创建了迭代器(状态)?还是它的“列表类型”总是包含迭代器状态?无论 Scala 使用什么解决方案:为什么 Rust 不使用它?
iter()、into_iter() 和 iter_mut() 之间的区别很重要。
iter),并且需要显式调用iter_mut 以进行可变迭代。
xs.iter().zip (ys)中的ys可以做同样的论证:你如何选择使用ys.iter()或ys.iter_mut()?
ys,我们使用into_iter。原因很简单:ys 被消费了,所以其他迭代器类型没有意义。
Vec没有实现Iterator特征的设计原因是什么?
它应该实现三个迭代器中的哪一个?您可以从Vec 获得三种不同类型的迭代器:
vec.iter() 给Iterator<Item = &T>,vec.iter_mut() 给出Iterator<Item = &mut T> 并修改向量和vec.into_iter() 提供Iterator<Item = T> 并在过程中消耗向量。与 Scala 相比:
在 Scala 中它也没有直接实现Iterator,因为Iterator 需要向量本身没有的下一项指针。然而,由于 Scala 没有移动语义,它只有一种从向量创建迭代器的方法,所以它可以隐式地进行转换。 Rust 有三种方法,所以它必须问你想要哪一种。
【讨论】:
into_iter() 是消耗向量的那个; drain 的不同之处在于它只清空向量。