さびのベクトル
12142 ワード
私は正直になります:私は最初に錆で利用可能なすべてのコレクションだけでなく、関連する概念を記述したい.それから、私は少しそれを掘り始めました、そして、私はそれがあまりに長い間あったと決めました.そのために、範囲を制限します
ここにダイブするダイアグラムです.
からdocumentation :
Javaと同じように
値を
イテレータは、古典的なデザインパターンで記述されたデザインパターンです:再利用可能なオブジェクト指向ソフトウェアブックの要素
本はイテレータを記述しますが、何もパターンをOOP言語に制限します.それはかなり広範な抽象化です.
錆は
イテレータを作成します.呼び出すから 次の値を得る 私が誤ったものから生じている各々のバグのためにドルを受け取ったならば
より短く,より安全に,よりよい
興味深いことに、私たちは、上記のコードをわずかに変えることができます
マジック! それは実際に魔法ではなく、アクションの中で錆'構文上の砂糖です.
あなた自身の違いを尋ねるならば
いくつかの研究の後、私はこの素晴らしい答えを見つけた
最後に、あなたは
自分自身を実装 第一、復帰 クリエイトア
我々は1つの側面を見落とした
錆は
With
これは、私の
さらに進む Module std::collections Storing Lists of Values with Vectors Struct std::vec::Vec What is the difference between iter and into_iter? 当初公開A Java Geek 2021年8月8日
Vec
種類ここにダイブするダイアグラムです.
ベクターの基礎
からdocumentation :
A contiguous growable array type, written as
Vec<T>
and pronounced 'vector'.
Javaと同じように
ArrayList
, Vec
を配列で返します.配列が満杯に達するとVec
より多くの容量とコピー要素を元の配列から新しく作成したものにコピーします.そして前者を解放する.コレクションは頻繁に再配置を避けるために必要以上の配列を割り当てることができます.値を
Vec
, 追加のステップを使用する必要がありますpush()
機能let mut v = Vec::new();
v.push(1);
v.push(5);
新規作成する関数Vec
アイテムを初期化します.を作成する場合Vec
そして同時に、ルストはvec!
マクロ.上記のコードを次の1つのライナーで置き換えることができます.let v = vec![1, 5];
その時点で、すでに錆でビットをつまんでいる場合は、おそらく何も新しいことを学んだ.すべての機能を記述する代わりにVec
- 彼らは、他の言語で見つけられたものとかなり類似しています-少しまわりを調査しましょう.ベクトルとイテレータ
イテレータは、古典的なデザインパターンで記述されたデザインパターンです:再利用可能なオブジェクト指向ソフトウェアブックの要素
Intent: Provide an object which traverses some aggregate structure, abstracting away assumptions about the implementation of that structure.
本はイテレータを記述しますが、何もパターンをOOP言語に制限します.それはかなり広範な抽象化です.
錆は
Iterator
特性Vec
実装します.したがって、その値を横断できます.let v = vec![1, 5];
let mut iter = v.iter(); // 1
loop {
let value = iter.next(); // 2
if value.is_some() {
println!("value: {}", value.unwrap());
} else {
break;
}
}
next()
の状態を変更するiter
, それは可能です.break
ステートメント、私は確かに今金持ちになります.あまりにも早く休憩する場合は、値を失う;あまりにも遅く、すべての地獄が緩んでいる.そのためにfor
イテレータとともに、より良い合うものです.上記のコードを書き換えることができます.let v = vec![1, 5];
for value in v.iter() { // 1
println!("value: {}", value);
}
イテレータからの反復子の多過ぎる
興味深いことに、私たちは、上記のコードをわずかに変えることができます
iter()
. それはまだ動作します!let v = vec![1, 5];
for value in v { // 1
println!("value: {}", value);
}
for
ループは反復子を受け入れる.しかし、いくつかのインスタンスは“オンザフライで”イテレータに変換することができます.型はIntoIterator
形質とそのITSinto_iter()
対象となる関数.上の図からわかるように、それはVec
.あなた自身の違いを尋ねるならば
iter()
and into_inter()
, 私が同様に思ったという事実で慰めてください.いくつかの研究の後、私はこの素晴らしい答えを見つけた
TL;DR:
- The iterator returned by
into_iter
may yield any ofT
,&T
or&mut T
, depending on the context.- The iterator returned by
iter
will yield&T
, by convention.- The iterator returned by
iter_mut
will yield&mut T
, by convention.
最後に、あなたは
Vec
からIterator
ありがとうFromIterator
.struct Foo {
count: u8
}
impl Iterator for Foo { // 1
type Item = u8;
fn next(&mut self) -> Option<Self::Item> {
match self.count {
0 => {
self.count = self.count + 1;
Option::Some(1) // 2
}
1 => {
self.count = self.count + 1;
Option::Some(5) // 2
}
_ => None // 2
}
}
}
let i = Foo { count: 0 };
let v = Vec::from_iter(i); // 3
for value in v {
println!("value: {}", value);
}
Iterator
1
, then 5
, 其れ無しVec
イテレータからメモリ割り当て
我々は1つの側面を見落とした
Vec
これまでのところ、定義は実際ですVec<T, A: Allocator = Global>
. 中T
は、Vec
含む、我々は見なかったA
, これはメモリを割り当てるものです.私は現在、関連する知識が不足しているので、主題を詳細に説明しません.しかし、私はそれについて言及するのが面白いと思います.An implementation of
Allocator
can allocate, grow, shrink, and deallocate arbitrary blocks of data described viaLayout
.
錆は
Global
デフォルトのメモリ割り当て.それは別のアロケータに委任しますSystem
を登録しない限り#[global_allocator]
属性.With
Vec<T, A>
, したがって、中央で定義されたものより異なるアロケータを使用することが可能です.つの可能なユースケースは、割り当てられたバイトをVec
インスタンス.結論
これは、私の
Vec
. このポストでは、私はこの種のポストの通常の取扱いを避けて、少しまわりを調査しようとしました.専用のメモリアロケータはほとんどの場合に必要ではありませんが、私はそれが良い場合に念頭に置いて良いトリックだと思う.さらに進む
Reference
この問題について(さびのベクトル), 我々は、より多くの情報をここで見つけました https://dev.to/nfrankel/rust-s-vector-2fnjテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol