簡體   English   中英

為什么 Vec 不實現 Iterator 特征?

[英]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獲得三種不同類型的迭代器:

  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有三種方法,所以一定要問你要哪一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM