Einfache Lifetime-Annotationen
Lifetimes stellen sicher, dass Referenzen so lange gültig bleiben, wie sie benötigt werden. Die Annotation '<'a>' teilt dem Compiler mit, dass das Struct nicht länger leben darf als die enthaltene…
Snippet öffnen →Lies diese Rust-Snippets für Fortgeschrittene Zeile für Zeile — jedes kommt mit einer Erklärung, was der Code tut und warum.
Lifetimes stellen sicher, dass Referenzen so lange gültig bleiben, wie sie benötigt werden. Die Annotation '<'a>' teilt dem Compiler mit, dass das Struct nicht länger leben darf als die enthaltene…
Snippet öffnen →Generische Schranken ermöglichen es, einen generischen Typ so einzuschränken, dass er bestimmte Verhaltensweisen (Traits) implementieren muss. Dies stellt sicher, dass die Funktion die benötigten M…
Snippet öffnen →Iteratoren in Rust sind 'lazy' (träge) und mächtig. 'filter' und 'map' ermöglichen Datentransformationen im funktionalen Stil ohne unnötige Zwischenspeicherungen.
Snippet öffnen →Der '?' Operator ist eine prägnante Art, Fehler zu behandeln. Wenn ein Result ein 'Err' ist, kehrt die Funktion vorzeitig mit diesem Fehler zurück; andernfalls wird der 'Ok'-Wert entpackt.
Snippet öffnen →Rust-Enums sind algebraische Datentypen. Sie können in jeder Variante verschiedene Datentypen speichern, die mit 'match' elegant extrahiert werden können.
Snippet öffnen →RefCell<T> bietet 'Interne Veränderbarkeit', ein Muster, das es ermöglicht, Daten zu verändern, selbst wenn man eine unveränderliche Referenz auf diese Daten hat. Die Borrowing-Regeln werden zur La…
Snippet öffnen →Arc (Atomic Reference Counted) ermöglicht es mehreren Threads, Eigentümer derselben Daten zu sein, während Mutex (Mutual Exclusion) sicherstellt, dass jeweils nur ein Thread die Daten verändern kann.
Snippet öffnen →Raw Pointers (*const T und *mut T) ermöglichen es, die Ownership- und Borrowing-Regeln von Rust zu umgehen. Das Dereferenzieren gilt als unsicher, da der Compiler nicht garantieren kann, dass der P…
Snippet öffnen →Die Entry-API ermöglicht es, die Existenz eines Schlüssels zu prüfen und eine Operation in einem einzigen Schritt durchzuführen. Dies vermeidet doppelte Lookups und bietet eine ausdrucksstärkere Ar…
Snippet öffnen →Das Schlüsselwort 'move' zwingt eine Closure dazu, das Eigentum an den Variablen zu übernehmen, die sie aus der Umgebung einfängt, anstatt sie nur auszuleihen. Dies ist oft erforderlich, wenn Closu…
Snippet öffnen →Rust kennt keine Null-Werte. Stattdessen repräsentiert Option<T> optionale Werte: Some(T) enthält einen Wert, None repräsentiert Abwesenheit. Dies macht Null-Zeiger-Ausnahmen zur Kompilierzeit unmö…
Snippet öffnen →Rust-Iteratoren sind faul — sie tun nichts bis sie konsumiert werden. Methoden wie filter, map und take sind Adaptoren, die Iteratoren transformieren ohne auszuführen. Die collect-Methode konsumier…
Snippet öffnen →impl-Blöcke definieren Methoden auf Structs. &self borgt das Struct unveränderlich, &mut self borgt veränderlich, und kein self erzeugt eine assoziierte Funktion (Konstruktor). Self bezieht sich au…
Snippet öffnen →Result<T, E> repräsentiert behebbare Fehler: Ok(T) für Erfolg, Err(E) für Fehlschlag. Der ?-Operator propagiert Fehler früh, verlässt die Funktion sofort bei Err. Dies ist idiomatische Rust-Fehlerb…
Snippet öffnen →Lebenszeiten sind Rusts Methode zur Gewährleistung von Speichersicherheit ohne Garbage Collection. Sie verfolgen, wie lange Referenzen gültig sind. Die 'a Lebenszeit-Annotation verbindet Eingabe- u…
Snippet öffnen →Trait-Grenzen beschränken generische Typen so, dass nur Werte akzeptiert werden die bestimmte Verhaltensweisen implementieren. Man kann mehrere Grenzen mit + kombinieren. Die impl Trait Syntax biet…
Snippet öffnen →Closures können Variablen aus ihrer umgebenden Umgebung erfassen. Rust bestimmt den Erfassungsmodus automatisch basierend darauf wie die Closure die Variable nutzt: by Reference, by Mutable Referen…
Snippet öffnen →Slices erlauben es auf eine zusammenhängende Sequenz von Elementen innerhalb einer Collection zu referenzieren ohne die Eigentümerschaft zu übernehmen. Der Slice-Typ wird geschrieben als &[T] für A…
Snippet öffnen →Cell-Typen ermöglichen mutable Datenteilung in Singlethread-Szenarien wo Borrow-Regeln normalerweise dagegen sprechen würden. Cell<T> funktioniert nur mit Copy-Typen und bietet set und get Methoden…
Snippet öffnen →Assoziierte Typen ermöglichen es Ihnen, Platzhaltertypen innerhalb eines Traits zu definieren, die implementierende Typen angeben müssen. Im Gegensatz zu generischen Typparametern erzwingen assozii…
Snippet öffnen →Benutzerdefinierte Fehlertypen kapseln domänenspezifische Fehlerfälle. Durch die Implementierung von Display werden Fehler menschenlesbar. Das Error-Trait ermöglicht Komponierbarkeit mit Rusts ?-Op…
Snippet öffnen →Rust bietet gestaffelte Fehlerbehandlungsstrategien. catch_unwind fängt Paniken zur sanften Wiederherstellung ab. expect bietet klare Fehlermeldungen für Option/Result. unwrap_or bietet Fallback-We…
Snippet öffnen →Const Generics ermöglichen die Verwendung von Konstanten als Typparameter und ermöglichen so Typen, die zur Kompilierzeit parametrisiert sind. Im Gegensatz zu C++-Templates mit Nicht-Typ-Parametern…
Snippet öffnen →Das Newtype Pattern umschließt primitive Typen in Tuple-Structs um verschiedene Typen mit null Laufzeitkosten zu erstellen. Dies bietet Kompilierzeit-Einheitsprüfung—Rust weigert sich, Kilogramm zu…
Snippet öffnen →OnceLock bietet Thread-sichere lazy Initialisierung für statische Daten. Die Konfiguration wird nur beim ersten Zugriff von der Festplatte gelesen, nicht beim Programmstart. Dies verbessert die Sta…
Snippet öffnen →Unsafe Rust gewährt direkten Speicherzugriff über das hinaus, was sicheres Rust erlaubt. Rohe Zeiger (*const T, *mut T) können nur in unsafe Blöcken dereferenziert werden, was Risiken von undefinie…
Snippet öffnen →Match-Ausdrücke in Rust bieten leistungsstarke Musterabgleich-Fähigkeiten. Sie können auf Enum-Varianten matchen, Wächterklauseln mit 'if'-Bedingungen einbeziehen und komplexe Daten direkt im Muste…
Snippet öffnen →Rust-Iteratoren verwenden Lazy Evaluation, was bedeutet, dass Operationen erst ausgeführt werden, wenn sie durch eine Terminal-Operation wie 'collect', 'sum' oder 'for_each' verbraucht werden. Dies…
Snippet öffnen →Der 'impl'-Block definiert Methoden und assoziierte Funktionen für Strukturen. Assoziierte Funktionen wie 'from_celsius' und 'from_fahrenheit' nehmen kein 'self' und dienen als Konstruktoren, wobei…
Snippet öffnen →Box<T> alloziert Werte auf dem Heap statt auf dem Stack. Es ist der primäre Weg, um singly-linked Datenstrukturen wie Bäume und verkettete Listen in Rust zu erstellen. Box<T> implementiert das Dere…
Snippet öffnen →