Zugreifen auf Werte
Teil des Abschnitts Logik & Kontrollfluss der Rust-Journey von Coddy. Lektion 30 von 66.
Sobald du Daten in deiner HashMap gespeichert hast, benötigst du eine Möglichkeit, sie abzurufen. Mit der Methode .get() kannst du mithilfe ihres Schlüssels nach einem Wert suchen:
let value = my_map.get("some_key");Es gibt jedoch ein wichtiges Detail, das du verstehen solltest: .get() gibt nicht direkt den Wert zurück. Stattdessen gibt es einen Option-Typ zurück: einen integrierten Rust-Typ, der entweder „etwas“ oder „nichts“ darstellt. Der Grund dafür ist, dass der Schlüssel, nach dem du suchst, in der Hash-Map möglicherweise nicht existiert.
Wenn der Schlüssel existiert, gibt .get() Some(&value) zurück – beachte das Symbol &, das bedeutet, dass du eine Referenz auf den Wert und nicht den Wert selbst erhältst. Wenn der Schlüssel nicht existiert, wird None zurückgegeben:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Dir fällt vielleicht auf, dass der match-Arm Some(capital) ohne ein explizites & verwendet. Das liegt daran, dass Rust in diesem Kontext die Referenz automatisch für dich behandelt: capital enthält weiterhin eine Referenz auf den Wert, aber du musst & im Muster nicht ausdrücklich schreiben. Rusts Pattern Matching ist intelligent genug, damit du capital direkt verwenden kannst, zum Beispiel beim Ausgeben.
Dieses Design verhindert, dass dein Programm abstürzt, wenn du versuchst, auf einen nicht vorhandenen Schlüssel zuzugreifen. Statt einen Fehler zu verursachen, zwingt Rust dich, beide Möglichkeiten zu behandeln – den Wert zu finden oder ihn nicht zu finden –, wodurch dein Code robuster und vorhersehbarer wird.
Aufgabe
EinfachDu erhältst zwei Eingaben: einen Ländernamen und den Namen einer Hauptstadt. Erstelle eine Hash-Map, die Ländernamen als Schlüssel (Typ String) und ihre Hauptstädte als Werte (Typ String) speichert. Füge das Land und seine Hauptstadt in die Hash-Map ein. Anschließend erhältst du eine dritte Eingabe mit dem Namen eines weiteren Landes, nach dem gesucht werden soll. Verwende die Methode .get(), um die Hauptstadt dieses Landes abzurufen, und behandle beide Fälle: wenn das Land in der Map existiert und wenn es nicht existiert.
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-Arm kannst du Some(capital) schreiben, und Rust behandelt die Referenz automatisch für dich, sodass du capital direkt in deiner Ausgabeanweisung verwenden kannst.
Anforderungen:
- Importiere
HashMapausstd::collections - Erstelle eine veränderliche Hash-Map mit den Typen
HashMap<String, String> - Lies die erste Eingabe als Ländernamen ein
- Lies die zweite Eingabe als Namen der Hauptstadt ein
- Füge das Land und die Hauptstadt in die Hash-Map ein
- Lies die dritte Eingabe als das Land ein, nach dem gesucht werden soll
- Verwende
.get(), um die Hauptstadt des gesuchten Landes abzurufen - Verwende
match, um das von.get()zurückgegebeneOptionzu behandeln - Wenn das Land gefunden wird, gib aus:
The capital of [country] is [capital] - Wenn das Land nicht gefunden wird, gib aus:
[country] not found in the map
Eingabe:
- Erste Zeile: Einzufügender Ländername (z. B.
France) - Zweite Zeile: Name der Hauptstadt (z. B.
Paris) - Dritte Zeile: Nachzuschlagender Ländername (z. B.
FranceoderGermany)
Ausgabe:
- Wenn das gesuchte Land existiert:
The capital of [country] is [capital] - Wenn das gesuchte Land nicht existiert:
[country] not found in the map
Probier es selbst
use std::collections::HashMap;
use std::io;
fn main() {
// Lies den Ländernamen zum Einfügen
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// Lies den Namen der Hauptstadt
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// Lies den Ländernamen zum Nachschlagen
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: Schreibe deinen Code darunter
// Erstelle eine HashMap, füge das Land und die Hauptstadt ein und schlage 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 Logik & Kontrollfluss
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Übe selbstständig: Online-Rust-Compiler