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 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.

challenge icon

Aufgabe

Einfach

Sie 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 HashMap aus std::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ü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

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 None zurü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
    
}
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