HashMap in Rust 2025: Literale, Makros und Best Practices

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

HashMap in Rust erstellen: Von Schmerz zu Schönheit im Jahr 2025

\n\n

Wenn Sie jemals in Rust programmiert und sich gefragt haben "How do I create a HashMap literal?" – Sie sind nicht allein. Diese Frage auf Stack Overflow hat Tausende von Aufrufen gesammelt, und das zu Recht. In Sprachen wie Python oder JavaScript ist das Erstellen eines Wörterbuchs buchstäblich ein Paar geschweifter Klammern. In Rust ist es etwas komplizierter … aber nur auf den ersten Blick.

\n\n

Im Jahr 2025 ist das Rust-Ökosystem weit vorangeschritten. Neue Makros sind erschienen, die Arbeit mit Konstanten wurde verbessert und der Compiler ist noch intelligenter geworden. In diesem Artikel werden wir alle Möglichkeiten zur Erstellung einer HashMap durchgehen, von den klassischen bis zu den modernsten. Sie erfahren, wie Sie nicht nur funktionierenden, sondern auch schönen, effizienten Code schreiben.

\n\n

Los geht's! 🦀

\n\n

Warum hat Rust kein eingebautes HashMap-Literal?

\n\n

Dies ist wohl die häufigste Frage von Anfängern. Die Antwort ist einfach: Rust ist nicht Python. Rust hat keine "Magie" auf Syntaxebene für Collections, da die Sprache nach Vorhersagbarkeit und Kontrolle über den Speicher strebt.

\n\n

Stellen Sie sich vor, Sie schreiben:

\n\n
let map = {"key1": "value1", "key2": "value2"};
\n\n

Sieht logisch aus? Ja. Aber was, wenn die Schlüssel oder Werte keine Strings sind, sondern komplexe Strukturen? Woher weiß der Compiler, welcher Allokator verwendet werden soll? Und was ist mit dem Hashing? Rust überlässt diese Entscheidungen dem Entwickler.

\n\n

Aus diesem Grund werden in der Standardbibliothek HashMap::new() und die Methoden .insert() zum Erstellen einer HashMap verwendet. Aber geben Sie zu, 10 Zeilen Code zu schreiben, um ein Wörterbuch mit drei Paaren zu erstellen, ist schmerzhaft. Glücklicherweise gibt es Lösungen.

\n\n

Methode Nr. 1: Klassiker – HashMap::new() + insert()

\n\n

Beginnen wir mit der Basis. Dies ist die verständlichste und transparenteste Methode. Sie erstellen eine leere HashMap und füllen sie:

\n\n
use std::collections::HashMap;\n\nfn main() {\n    let mut scores = HashMap::new();\n    scores.insert("Alice".to_string(), 42);\n    scores.insert("Bob".to_string(), 27);\n    scores.insert("Charlie".to_string(), 35);\n\n    println!("{:?}", scores);\n}
\n\n

Vorteile:

\n
    \n
  • Volle Kontrolle über den Prozess.
  • \n
  • Elemente können bedingt hinzugefügt werden.
  • \n
  • Keine zusätzlichen Abhängigkeiten erforderlich.
  • \n
\n\n

Nachteile:

\n
    \n
  • Umständlich.
  • \n
  • Erfordert mut.
  • \n
  • Nicht für Konstanten geeignet.
  • \n
\n\n

Diese Methode eignet sich gut für dynamische Befüllung, ist aber für statische Daten überflüssig.

\n\n

Methode Nr. 2: from() – wenn die Daten bereits bereit sind

\n\n

Wenn Sie einen Vektor von Tupeln haben, können Sie HashMap::from() verwenden:

\n\n
use std::collections::HashMap;\n\nfn main() {\n    let data = vec![\n        ("Alice", 42),\n        ("Bob", 27),\n        ("Charlie", 35),\n    ];\n\n    let scores: HashMap<&str, i32> = HashMap::from(data);\n    println!("{:?}", scores);\n}
\n\n

Das kommt einem "Literal" schon näher. Es sieht sauberer aus, erfordert aber immer noch einen Zwischenvektor. Es funktioniert schnell, kann aber bei großen Datensätzen aufgrund doppelter Speicherzuweisung ineffizient sein.

\n\n

Methode Nr. 3: collect() – funktionaler Ansatz

\n\n

Fans von Iteratoren werden diese Methode mögen:

\n\n
use std::collections::HashMap;\n\nfn main() {\n    let scores: HashMap<&str, i32> = [\n        ("Alice", 42),\n        ("Bob", 27),\n        ("Charlie", 35),\n    ].iter().cloned().collect();\n\n    println!("{:?}", scores);\n}
\n\n

Schön? Ja. Lesbar? Mit Einschränkungen. Aber es ist eine der idiomatischsten Methoden in Rust. .iter().cloned().collect() ist ein Standardmuster zum Konvertieren eines Arrays in eine Collection.

\n\n

Übrigens, wenn Ihre Schlüssel und Werte Copy implementieren, können Sie .copied() anstelle von .cloned() verwenden – das ist etwas schneller.

\n\n

Methode Nr. 4: Das Makro hashmap! – die Rettung aus dem Jahr 2025

\n\n

Und hier

Blogs

Buchempfehlungen