Menu
Coddy logo textTech

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 entweder „etwas“ oder „nichts“ darstellt. 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, nicht den Wert selbst. 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"),
}

Sie werden vielleicht bemerken, dass der Match-Arm Some(capital) ohne ein explizites & verwendet. Dies liegt daran, dass Rust die Referenz in diesem Kontext automatisch für Sie verarbeitet — capital hält immer noch eine Referenz auf den Wert, aber Sie müssen kein & explizit im Muster schreiben. Das Pattern Matching von Rust ist intelligent genug, um Sie capital direkt verwenden zu lassen, zum Beispiel beim Ausgeben.

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 – das Finden des Wertes oder das Nichtfinden – was Ihren Code robuster und vorhersehbarer macht.

challenge icon

Aufgabe

Einfach

Sie erhalten zwei Eingaben: einen Ländernamen und den Namen einer 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. Anschließend 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 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-Zweig können Sie Some(capital) schreiben, und Rust wird die Referenz automatisch für Sie verarbeiten, sodass Sie capital direkt in Ihrer Print-Anweisung verwenden können.

Anforderungen:

  • Importieren Sie HashMap aus std::collections
  • Erstellen Sie eine veränderbare (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ückgegebene Option zu 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. France oder Germany)

Ausgabe:

  • Wenn das nachgeschlagene Land existiert: The capital of [country] is [capital]
  • Wenn das nachgeschlagene Land nicht existiert: [country] not found in the map

Probier es selbst

use std::collections::HashMap;
use std::io;

fn main() {
    // Lies den Namen des einzufügenden Landes ein
    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 ein
    let mut capital = String::new();
    io::stdin().read_line(&mut capital).expect("Failed to read line");
    let capital = capital.trim().to_string();
    
    // Lies den Namen des nachzuschlagenden Landes ein
    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 unten
    // Erstelle eine HashMap, füge das Land und die Hauptstadt ein und schlage dann das Land nach
    
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logic & Flow