[英]Why doesn't Vec implement the Iterator trait?
Vec
沒有實現Iterator
特征的設計原因是什么? 必須始終在所有向量和切片上調用iter()
會導致代碼行更長。
例子:
let rx = xs.iter().zip(ys.iter());
與 Scala 相比:
val rx = xs.zip(ys)
一個迭代器有一個迭代 state。 它必須知道下一個要給你的元素是什么。
所以向量本身不是迭代器,區別很重要。 您可以在同一個向量上有兩個迭代器,例如,每個迭代器都有其特定的迭代 state。
但是向量可以為您提供一個迭代器,這就是它實現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);
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有三種方法,所以一定要問你要哪一種。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.