VecがIteratorトレイトを実装しないのはなぜですか?


回答:


14

イテレータには反復状態があります。それはあなたに与える次の要素が何であるかを知る必要があります。

そのため、ベクター自体はイテレーターではなく、区別が重要です。たとえば、同じベクトルに対して2つのイテレータを使用でき、それぞれに特定の反復状態があります。

しかし、ベクターはイテレーターを提供できます。そのため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はそれを使用しないのですか?
Lukas Kalbertodt

5
@DenysSéguret錆、の区別であるためiter()into_iter()とはiter_mut()重要です。
Sebastian Redl

2
@DenysSéguretあなたは正しい。(を使用してiter)不変の反復に対してのみ有効にしiter_mut、可変の反復に対して明示的な呼び出しを必要とするでしょう。
Jmb 2019年

2
同じ引数がysinにも当てはまることに注意してくださいxs.iter().zip (ys)。どのように使用するys.iter()か、またはys.iter_mut()
Jmb

2
の場合ys、を使用しますinto_iter。理由は単純です:ys消費されるため、他の種類のイテレータは意味がありません。
ケルベロス

4

トレイトをVec実装しない理由は何Iteratorですか?

3つの反復子のどれを実装する必要がありますか?から取得できる3種類のイテレータがあります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には移動のセマンティクスがないため、ベクトルからイテレーターを作成する方法は1つしかないため、暗黙的に変換を行うことができます。Rustには3つの方法があるため、どちらを使用するかを尋ねる必要があります。


4
into_iter()ベクトルを消費するものです。ベクトルを空にするdrainだけである点が異なります
trentcl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.