Vec为什么不实现Iterator特性?

时间:2019-11-06 07:54:42

标签: rust

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

示例:

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

与Scala相比:

val rx = xs.zip(ys)

2 个答案:

答案 0 :(得分:14)

迭代器具有迭代状态。它必须知道接下来要给您的内容是什么。

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

但是向量可以为您提供迭代器,这就是为什么它实现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);

答案 1 :(得分:4)

  

let { path, url } = useRouteMatch(); <div className={classes.content}> <Route path={`${url}`} component={ProjectsListContainer} /> <Route path={`${url}/create`} component={CreateProject} /> <Route path={`${url}/:id`} component={Kanban} /> </div> 不实现Vec特征的设计原因是什么?

它应该实现三个迭代器中的哪个?从Iterator可以得到三种不同的迭代器:

  1. Vec给出vec.iter()
  2. Iterator<Item = &T>给出vec.iter_mut()并修改向量,并且
  3. Iterator<Item = &mut T>给出vec.into_iter()并在此过程中使用向量。
  

与Scala相比:

在Scala中,它也不直接实现Iterator<Item = T>,因为Iterator需要向量本身不具有的下一个项目指针。但是,由于Scala没有移动语义,因此只有一种方法可以从向量创建迭代器,因此它可以隐式进行转换。 Rust有三种方法,因此必须问您要哪一种。