Rust von den Grundlagen bis zum Profi — Folge 6
Verarbeiten von Daten mit Sammlungen, Iteratoren und Abschlüssen
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Die Standardsammlungen von Rust besitzen die Werte, die sie speichern. Iteratoren unterscheiden je nach Typ die Art und Weise, wie eine Sammlung gelesen, ausgeliehen oder konsumiert wird.
Vec und 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 ist eine geordnete Liste und HashMap findet Werte nach Schlüssel. Da get möglicherweise keinen Wert hat, gibt es Option zurück.
Der Borrow-Checker verhindert, dass interne Elementverweise beibehalten werden, während die Sammlung neu zugewiesen oder geändert wird.
Eigentumsmethode des Iterators
for name in &party {
println!("{name}");
}
for name in &mut party {
name.push_str("_01");
}
&party leiht das Element unveränderlich aus, und &mut party leiht es veränderlich. Wenn die Partei selbst als Wert wiederholt wird, verschiebt sich der Besitz des Elements und das Original kann später nicht mehr verwendet werden.
Iteratoren und Abschlüsse
let mut alive: Vec<&Monster> = monsters
.iter()
.filter(|monster| monster.health > 0)
.collect();
alive.sort_by_key(|monster| monster.health);
iter erstellt einen Iterator, der Elemente ausleiht, und der Filter übergibt nur Werte, die die Bedingungen erfüllen. Die endgültige Sammlung wird erstellt, wenn „collect“ aufgerufen wird.
let bonus = 5;
let add_bonus = |damage: i32| damage + bonus;
Schließungen können durch Ausleihen oder Verschieben von Umgebungswerten erfasst werden. Wenn die Schließung ihren ursprünglichen Umfang überdauern muss, müssen Sie prüfen, ob move benötigt wird und wohin die Eigentümerschaft geht.
Iteratorcode wird nicht unbedingt verwendet, da er schnell ist. Der Vorteil besteht darin, dass die Absicht von Filtern und Transformationen schrittweise ausgedrückt werden kann, während die Eigentums- und Ausleihmethoden beibehalten werden.