Zugreifen auf Werte
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 30 von 66.
Sobald Sie Daten in Ihrer Hash-Map gespeichert haben, benötigen Sie eine Möglichkeit, diese abzurufen. Die Methode .get() ermöglicht es Ihnen, einen Wert anhand seines Schlüssels nachzuschlagen:
let value = my_map.get("some_key");Es gibt jedoch ein wichtiges Detail zu verstehen: .get() gibt den Wert nicht direkt zurück. Stattdessen gibt es einen Option-Typ zurück – einen integrierten Rust-Typ, der darstellt, ob ein Wert entweder vorhanden (Some) oder nicht vorhanden (None) ist. Dies liegt daran, dass der Schlüssel, nach dem Sie suchen, möglicherweise nicht in der Hash-Map existiert.
Wenn der Schlüssel existiert, gibt .get() Some(&value) zurück – beachten Sie das &-Symbol, was bedeutet, dass Sie eine Referenz auf den Wert erhalten. Wenn der Schlüssel nicht existiert, gibt sie None zurück:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Im Some(capital) Match-Arm verarbeitet Rust die Referenz automatisch für Sie – capital ist hier an den inneren referenzierten Wert gebunden, sodass Sie & nicht explizit im Muster schreiben müssen.
Dieses Design verhindert, dass Ihr Programm abstürzt, wenn Sie versuchen, auf einen Schlüssel zuzugreifen, der nicht existiert. Anstatt einen Fehler zu verursachen, zwingt Rust Sie dazu, beide Möglichkeiten zu behandeln – den Wert zu finden oder ihn nicht zu finden – was Ihren Code robuster und vorhersehbarer macht.
Aufgabe
EinfachSie erhalten zwei Eingaben: einen Ländernamen und einen Namen der Hauptstadt. Erstellen Sie eine Hash-Map, die Ländernamen als Schlüssel (Typ String) und deren Hauptstädte als Werte (Typ String) speichert. Fügen Sie das Land und seine Hauptstadt in die Hash-Map ein. Danach erhalten Sie eine dritte Eingabe mit einem weiteren Ländernamen, den Sie nachschlagen sollen. Verwenden Sie die Methode .get(), um die Hauptstadt für dieses Land abzurufen, und behandeln Sie beide Fälle: wenn das Land in der Map existiert und wenn nicht.
Hinweis: .get() gibt ein Option zurück — entweder Some(&value) (eine Referenz auf den Wert), wenn der Schlüssel existiert, oder None, wenn er nicht existiert. In einem match-Zweig können Sie Some(capital) schreiben, und Rust wird die Referenz automatisch für Sie handhaben, sodass Sie capital direkt in Ihrer Print-Anweisung verwenden können.
Anforderungen:
- Importieren Sie
HashMapausstd::collections - Erstellen Sie eine veränderliche (mutable) Hash-Map mit den Typen
HashMap<String, String> - Lesen Sie die erste Eingabe als Ländernamen ein
- Lesen Sie die zweite Eingabe als Namen der Hauptstadt ein
- Fügen Sie das Land und die Hauptstadt in die Hash-Map ein
- Lesen Sie die dritte Eingabe als das nachzuschlagende Land ein
- Verwenden Sie
.get(), um die Hauptstadt für das nachzuschlagende Land abzurufen - Verwenden Sie
match, um das von.get()zurückgegebeneOptionzu behandeln - Wenn das Land gefunden wird, geben Sie aus:
The capital of [country] is [capital] - Wenn das Land nicht gefunden wird, geben Sie aus:
[country] not found in the map
Eingabe:
- Erste Zeile: Name des einzufügenden Landes (z. B.
France) - Zweite Zeile: Name der Hauptstadt (z. B.
Paris) - Dritte Zeile: Name des nachzuschlagenden Landes (z. B.
FranceoderGermany)
Ausgabe:
- Wenn das nachgeschlagene Land existiert:
The capital of [country] is [capital] - Wenn das nachgeschlagene Land nicht existiert:
[country] not found in the map
Spickzettel
Die Methode .get() ruft einen Wert aus einer Hash-Map anhand seines Schlüssels ab:
let value = my_map.get("some_key");Die Methode .get() gibt einen Option-Typ zurück, da der Schlüssel in der Hash-Map möglicherweise nicht existiert:
- Wenn der Schlüssel existiert: gibt
Some(&value)zurück (eine Referenz auf den Wert) - Wenn der Schlüssel nicht existiert: gibt
Nonezurück
Verwenden Sie match, um beide Fälle zu behandeln:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Dieses Design verhindert Abstürze beim Zugriff auf nicht existierende Schlüssel, indem es Sie zwingt, beide Möglichkeiten zu behandeln.
Probier es selbst
use std::collections::HashMap;
use std::io;
fn main() {
// Den Namen des einzufügenden Landes lesen
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// Den Namen der Hauptstadt lesen
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// Den Namen des nachzuschlagenden Landes lesen
let mut lookup_country = String::new();
io::stdin().read_line(&mut lookup_country).expect("Failed to read line");
let lookup_country = lookup_country.trim().to_string();
// TODO: Schreiben Sie Ihren Code unten
// Erstellen Sie eine HashMap, fügen Sie das Land und die Hauptstadt ein und schlagen Sie dann das Land nach
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittener Kontrollfluss
Der 'match'-AusdruckAbgleichen mehrerer WerteBereiche abgleichenDer 'if let'-AusdruckSchleifen als AusdrückeRückblick – Einfacher Befehls-Parser4Daten gruppieren mit Structs
Was ist ein Struct?Übersicht über StructsZugriff auf Struct-FelderVeränderbare StructsStructs als FunktionsparameterTupel-StructsZusammenfassung – Ein Buch-Struct erstellen2Einführung in Vektoren
Was ist ein Vektor?Einen Vektor erstellenElemente mit push hinzufügenZugriff auf Vektor-ElementeÜber einen Vektor iterierenVeränderliche IterationElemente entfernenZusammenfassung – Einfacher Score-Tracker5Schlüssel-Wert-Paare mit Hash Maps
Was ist eine Hash Map?Erstellen einer Hash MapEinfügen von Schlüssel-Wert-PaarenZugreifen auf WerteIterieren über eine Hash MapAktualisieren eines WertesEntfernen eines PaaresZusammenfassung – Wortzähler8Projekt: Einfaches Artikelinventar
Projekt-SetupEinen Artikel hinzufügenLagerbestand prüfenEinen Artikel verkaufenAlles zusammenfügen11Abschluss-Herausforderungen
Wiederholung - Einzigartige ElementeWiederholung - Benutzerprofil-ValidatorWiederholung - Noten-Zusammenfassung3Kommandozeilen-To-Do-Liste
Projekt-SetupEine Aufgabe hinzufügenAlle Aufgaben anzeigenEine Aufgabe entfernenFinaler Code