Generics in Rust: warum sie nützlich sind und wie man sie als Anfänger verwendet

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

Einleitung: Was sind Generics und warum gibt es sie in Rust?

\n

Stellen Sie sich vor, Sie müssen eine Funktion schreiben, die das größte Element in einer Liste findet. Für ganze Zahlen – eine Funktion, für Gleitkommazahlen – eine andere, für Zeichenketten – eine dritte. Der Code würde sich wiederholen und die Wartung würde schwierig werden. In Rust löst Generics (generische Programmierung) dieses Problem.

\n

Generics ermöglichen es, Code zu schreiben, der mit verschiedenen Datentypen arbeitet, ohne dabei die strenge Typisierung zu verlieren. Anstatt Funktionen für jeden Typ zu duplizieren, schreiben Sie eine generische Version. Rust setzt zur Kompilierzeit den konkreten Typ ein und prüft die Korrektheit. Dies bietet:

\n
    \n
  • Wiederverwendbarkeit von Code – eine Funktion für alle Typen.
  • \n
  • Sicherheit – alle Typfehler werden zur Kompilierzeit abgefangen.
  • \n
  • Leistung – dank Monomorphisierung (der Compiler generiert separaten Code für jeden verwendeten Typ) arbeitet generischer Code genauso schnell wie spezialisierter.
  • \n
\n

In diesem Artikel werden wir anhand praktischer Beispiele durchgehen, wie man Generics in Rust verwendet, angefangen bei einfachen Funktionen bis hin zu Strukturen und Traits.

\n\n

1. Generics in Funktionen: Der erste Schritt zur Universalität

\n

Syntax und grundlegendes Beispiel

\n

Um eine Funktion generisch zu machen, müssen Sie den Typparameter in spitzen Klammern <T> angeben. Üblicherweise werden Großbuchstaben verwendet: T, U, V. So sieht eine Funktion aus, die den übergebenen Wert zurückgibt:

\n
fn identity<T>(value: T) -> T {\n    value\n}\n\nfn main() {\n    let num = identity(42);\n    let text = identity("Hello");\n    println!("{} {}", num, text); // Gibt aus: 42 Hello\n}
\n

Der Compiler leitet den Typ basierend auf dem übergebenen Argument selbst ab. Sie können den Typ auch explizit angeben: identity::<i32>(42).

\n\n

Einschränkungen: Traits als Typgrenzen

\n

Was ist, wenn wir Werte vergleichen möchten? Einfach value1 > value2 zu schreiben, funktioniert nicht – nicht alle Typen unterstützen Vergleiche. Sie müssen angeben, dass der Typ das Trait PartialOrd implementieren muss:

\n
fn largest<T: PartialOrd>(list: &[T]) -> &T {\n    let mut largest = &list[0];\n    for item in list {\n        if item > largest {\n            largest = item;\n        }\n    }\n    largest\n}\n\nfn main() {\n    let numbers = vec![34, 50, 25, 100, 65];\n    println!("Größte Zahl: {}", largest(&numbers));\n\n    let chars = vec!['y', 'm', 'a', 'q'];\n    println!("Größtes Zeichen: {}", largest(&chars));\n}
\n

Hier ist T: PartialOrd eine Trait-Einschränkung. Sie stellt sicher, dass für den Typ T der Vergleichsoperator definiert ist. Ohne diese Einschränkung würde der Code nicht kompilieren.

\n\n

2. Generics in Strukturen und Aufzählungen

\n

Strukturen mit generischen Feldern

\n

Generics funktionieren auch hervorragend mit benutzerdefinierten Typen. Beispielsweise kann die Struktur Point Koordinaten beliebigen Typs speichern:

\n
struct Point<T> {\n    x: T,\n    y: T,\n}\n\nfn main() {\n    let integer_point = Point { x: 5, y: 10 };\n    let float_point = Point { x: 1.0, y: 4.0 };\n    // let mixed = Point { x: 5, y: 4.0 }; // Fehler! Beide Felder müssen vom gleichen Typ sein\n}
\n

Wenn die Felder unterschiedliche Typen haben sollen, verwenden Sie mehrere Parameter:

\n
struct Point<T, U> {\n    x: T,\n    y: U,\n}\n\nfn main() {\n    let mixed = Point { x: 5, y: 4.0 }; // Funktioniert jetzt\n}
\n\n

Aufzählungen mit Generics

\n

Die Standard-Aufzählung Option<T> ist ein hervorragendes Beispiel für eine generische Aufzählung. Sie können Ihre eigene erstellen:

\n
enum Result<T, E> {\n    Ok(T),\n    Err(E),\n}\n\n// Verwendung\nfn divide(a: f64, b: f64) -> Result<f64, String> {\n    if b                

Blogs

Buchempfehlungen