回答:
イテレータには反復状態があります。それはあなたに与える次の要素が何であるかを知る必要があります。
そのため、ベクター自体はイテレーターではなく、区別が重要です。たとえば、同じベクトルに対して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はそれを使用しないのですか?
iter()
、into_iter()
とはiter_mut()
重要です。
iter
)不変の反復に対してのみ有効にしiter_mut
、可変の反復に対して明示的な呼び出しを必要とするでしょう。
ys
inにも当てはまることに注意してくださいxs.iter().zip (ys)
。どのように使用するys.iter()
か、またはys.iter_mut()
?
ys
、を使用しますinto_iter
。理由は単純です:ys
消費されるため、他の種類のイテレータは意味がありません。
トレイトを
Vec
実装しない理由は何Iterator
ですか?
3つの反復子のどれを実装する必要がありますか?から取得できる3種類のイテレータがありますVec
。
vec.iter()
与えIterator<Item = &T>
、vec.iter_mut()
Iterator<Item = &mut T>
ベクトルを与え、修正し、vec.into_iter()
Iterator<Item = T>
その過程でベクトルを与え、消費します。Scalaと比較して:
Scalaでは、ベクター自体が持たない次の項目ポインターが必要なIterator
ため、直接実装することもIterator
ありません。ただし、Scalaには移動のセマンティクスがないため、ベクトルからイテレーターを作成する方法は1つしかないため、暗黙的に変換を行うことができます。Rustには3つの方法があるため、どちらを使用するかを尋ねる必要があります。
into_iter()
ベクトルを消費するものです。ベクトルを空にするdrain
だけである点が異なります。