Rust 基礎からマスターまで — 第6回
コレクション、イテレータ、クロージャでデータを処理する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
Rust標準コレクションは、自分が保存した値を所有しています。 イテレータは、コレクションを読み、借りる、または消費する方法を型に分類します。
VecとHashMap
use std::collections::HashMap;
let mut party = Vec::new();
party.push(String::from("Rose"));
let mut items = HashMap::new();
items.insert(10, String::from("Potion"));
if let Some(name) = items.get(&10) {
println!("{name}");
}
Vecは順序付きリストで、HashMapはキーで値を検索します。 getは値がない可能性があるため、Optionを返します。
コレクションが再割り当てまたは変更されている間に内部要素参照を維持しないように、借り手チェッカーがブロックされます。
イテレータの所有方法
for name in &party {
println!("{name}");
}
for name in &mut party {
name.push_str("_01");
}
&partyは元素を不変に借り、&mut partyは変更可能に借りる。 party自体を値で繰り返すと、元素の所有権が移動し、以後、原本を使用できなくなる。
イテレータとクロージャ
let mut alive: Vec<&Monster> = monsters
.iter()
.filter(|monster| monster.health > 0)
.collect();
alive.sort_by_key(|monster| monster.health);
iterは要素を借りる反復子を作成し、filterは条件に合った値だけを渡します。 collectが呼び出されると、最終的なコレクションが作成されます。
let bonus = 5;
let add_bonus = |damage: i32| damage + bonus;
クロージャは周囲の値を借りたり移動したりすることができます。 クロージャが元の範囲より長く生きなければならない場合は、moveが必要かどうか、所有権がどこに行くかを確認する必要があります。
イテレータコードは無条件に速いので書くのではありません。 所有と借り方を守りつつ、フィルタと変換の意図を段階で表現できるという点が長所だ。