Vec
不实现Iterator
特征的设计原因是什么?必须始终在所有向量和切片上调用iter()
使得代码行更长。
示例:
let rx = xs.iter().zip(ys.iter());
与Scala相比:
val rx = xs.zip(ys)
答案 0 :(得分:14)
迭代器具有迭代状态。它必须知道接下来要给您的内容是什么。
因此,向量本身不是迭代器,因此区别很重要。例如,您可以在同一个向量上有两个迭代器,每个迭代器都有其特定的迭代状态。
但是向量可以为您提供迭代器,这就是为什么它实现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);
答案 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
可以得到三种不同的迭代器:
Vec
给出vec.iter()
,Iterator<Item = &T>
给出vec.iter_mut()
并修改向量,并且Iterator<Item = &mut T>
给出vec.into_iter()
并在此过程中使用向量。与Scala相比:
在Scala中,它也不直接实现Iterator<Item = T>
,因为Iterator
需要向量本身不具有的下一个项目指针。但是,由于Scala没有移动语义,因此只有一种方法可以从向量创建迭代器,因此它可以隐式进行转换。 Rust有三种方法,因此必须问您要哪一种。