[解決済み】iterとinto_iterの違いは何ですか?
質問
をやっています。 例によって錆び チュートリアルに、このようなコードがあります。
// Vec example
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];
// `iter()` for vecs yields `&i32`. Destructure to `i32`.
println!("2 in vec1: {}", vec1.iter() .any(|&x| x == 2));
// `into_iter()` for vecs yields `i32`. No destructuring required.
println!("2 in vec2: {}", vec2.into_iter().any(| x| x == 2));
// Array example
let array1 = [1, 2, 3];
let array2 = [4, 5, 6];
// `iter()` for arrays yields `&i32`.
println!("2 in array1: {}", array1.iter() .any(|&x| x == 2));
// `into_iter()` for arrays unusually yields `&i32`.
println!("2 in array2: {}", array2.into_iter().any(|&x| x == 2));
私は完全に混乱しています。
Vec
から返されるイテレータは
iter
は参照を生成し、イテレータは
into_iter
は値を生成しますが、配列の場合、これらのイテレータは同一なのでしょうか?
この2つのメソッドのユースケース/APIは何ですか?
どのように解決するのですか?
TL;DR。
-
が返すイテレータは
into_iter
のいずれかを得ることができます。T
,&T
または&mut T
文脈によって異なります。 -
が返すイテレータは
iter
は&T
慣例により -
が返すイテレータは
iter_mut
は&mut T
慣例により
最初の質問は、"何ですか?
into_iter
?quot。
into_iter
が出てきます。
IntoIterator
特性
:
pub trait IntoIterator where <Self::IntoIter as Iterator>::Item == Self::Item, { type Item; type IntoIter: Iterator; fn into_iter(self) -> Self::IntoIter; }
特定の型をどのようにイテレータに変換するかを指定したい場合に、この trait を実装します。最も顕著なのは、もしある型が
IntoIterator
で使用することができます。
for
のループになります。
例えば
Vec
を実装しています。
IntoIterator
......3回!
impl<T> IntoIterator for Vec<T>
impl<'a, T> IntoIterator for &'a Vec<T>
impl<'a, T> IntoIterator for &'a mut Vec<T>
それぞれのバリエーションが微妙に違う。
こちらは
Vec
とそのイテレータである
収量
値
(
T
を直接入力)。
impl<T> IntoIterator for Vec<T> { type Item = T; type IntoIter = IntoIter<T>; fn into_iter(mut self) -> IntoIter<T> { /* ... */ } }
他の二つは、参照によってベクトルを取ります。
into_iter(self)
なぜなら
self
はどちらの場合も参照です)、そのイテレータは、その中の要素への参照を生成します。
Vec
.
こちら 収量 不変のリファレンス :
impl<'a, T> IntoIterator for &'a Vec<T> { type Item = &'a T; type IntoIter = slice::Iter<'a, T>; fn into_iter(self) -> slice::Iter<'a, T> { /* ... */ } }
一方、こちらは 収穫 ミュータブルリファレンス :
impl<'a, T> IntoIterator for &'a mut Vec<T> { type Item = &'a mut T; type IntoIter = slice::IterMut<'a, T>; fn into_iter(self) -> slice::IterMut<'a, T> { /* ... */ } }
だから
とはどのような違いがあるのでしょうか?
iter
とinto_iter
?
into_iter
は、イテレータが値、不変参照、可変参照を生成するかどうかを取得する汎用的なメソッドです。
はコンテキストに依存します。
と驚くことがあります。
iter
と
iter_mut
はアドホックなメソッドです。したがって、それらの戻り値の型はコンテキストに依存せず、慣例的にそれぞれ不変参照と可変参照を返すイテレータとなります。
Rust by Exampleの著者は、このようなコンテキスト(つまり型)への依存から生じる驚きを、Rust by Exampleの投稿で説明しています。
into_iter
が呼び出されるという事実を利用して、さらに問題を複雑にしている。
-
IntoIterator
は実装されていません。[T; N]
のみであり&[T; N]
と&mut [T; N]
-- 2021年のラスト向けとなります。 - ある値に対してメソッドが実装されていない場合、自動的に検索されるのは リファレンス の代わりに、その値に対する
にとって非常に驚くべきことですが
into_iter
を除くすべてのタイプは
[T; N]
は、3つのバリエーション (値と参照) すべてに対して実装されています。)
配列の実装
IntoIterator
(への参照を反復できるようにするためです。
for
のループになります。
Rust 1.51 では、配列に値を返すイテレータを実装することが可能です (via.
array::IntoIter
を実装していますが、既存の
IntoIterator
を自動的に参照する
による値ごとの繰り返しを実装することは困難です。
IntoIterator
.
関連
-
[解決済み] rustupでインストールしたRustをアンインストールするには?
-
[解決済み] Rustで絶対値を求めるには?
-
[解決済み] usize` と `u32` の違いは何ですか?
-
[解決済み] Rust の `String` と `str` の違いは何ですか?
-
[解決済み】文字列をint型に変換する?
-
[解決済み] 同じプロジェクトの別のファイルからモジュールをインクルードする方法は?
-
[解決済み] RustのtraitとHaskellのtypeclassの違いは何ですか?
-
[解決済み] CopyとCloneの違いは何ですか?
-
[解決済み] バイトのベクター(u8)を文字列に変換するには?
-
[解決済み] ローカルの未公開クレートを使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] rustupでインストールしたRustをアンインストールするには?
-
[解決済み] Rustで絶対値を求めるには?
-
[解決済み] Rustにはキューとスタックコレクションがありますか?
-
[解決済み] Rustで絶対値を求めるには?
-
[解決済み] Rustのユニットテストでprintln! が動作しないのはなぜ?
-
[解決済み】ライブラリとバイナリの両方を持つRustパッケージ?
-
[解決済み】Rustの正確な自動再参照のルールは?
-
[解決済み] このクエスチョンマークの演算子は何についてですか?
-
[解決済み] クロージャがFn、FnMut、FnOnceを実装するのはどんなとき?
-
[解決済み] カスタムステップで範囲を反復処理するには?