Kurz: Debug, Display, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, From, Into, Iterator, Drop, Add, Deref, AsRef, Send, Sync.
Teil des Kurses Rust
Typen
| Typ | Beispiele |
|---|---|
| Ganzzahlen | i8 i16 i32 i64 i128 isize, u8 u16 u32 u64 u128 usize |
| Gleitkomma | f32, f64 |
| Sonstige | bool, char, () (Unit) |
| Text | String (besitzt), &str (geliehen) |
| Zusammengesetzt | Tupel (i32, f64), Array [i32; 3], Slice &[i32] |
| Standard | Vec<T>, HashMap<K,V>, Option<T>, Result<T,E>, Box<T> |
Besitz und Referenzen
| Syntax | Bedeutung |
|---|---|
let a = b; | Besitz zieht um (bei Nicht-Copy-Typen) |
b.clone() | tiefe Kopie |
&x | geliehene Referenz (nur lesen), beliebig viele |
&mut x | veränderbare Referenz, nur eine zur selben Zeit |
'a | Lifetime-Parameter |
*r | Dereferenzieren |
Kontrollfluss
if x > 0 { ... } else if x == 0 { ... } else { ... }
let w = if a { 1 } else { 2 };
match wert { 1 => ..., 2 | 3 => ..., 4..=9 => ..., n if n < 0 => ..., _ => ... }
if let Some(x) = opt { ... }
let Some(x) = opt else { return };
while bedingung { ... }
loop { ... break wert; }
for i in 0..10 { ... } // 0..=10 inklusiveFunktionen, Structs, Enums, Traits
fn name(a: i32, b: &str) -> i32 { a }
struct Punkt { x: f64, y: f64 }
impl Punkt { fn neu() -> Self {..} fn laenge(&self) -> f64 {..} }
enum Form { Kreis(f64), Rechteck { b: f64, h: f64 }, Leer }
trait Tier { fn laut(&self) -> String; }
impl Tier for Hund { ... }
fn f<T: Display + Clone>(x: T) where T: Debug {..}
fn g(x: &impl Tier) {..}
Box<dyn Tier>Fehler
| Muster | Bedeutung |
|---|---|
Option<T>: Some(x)/None | Wert optional |
Result<T, E>: Ok(x)/Err(e) | Erfolg oder Fehler |
x? | Fehler nach oben weitergeben |
.unwrap() / .expect("msg") | Panic bei Fehler (nur Tests, Prototypen) |
.unwrap_or(d), .unwrap_or_else(f) | Ersatzwert |
.map(f), .and_then(f), .ok_or(e) | Verketten und Umwandeln |
Wichtige Makros
| Makro | Zweck |
|---|---|
println!, print!, eprintln! | Ausgabe |
format! | String bauen |
vec![] | Vec erzeugen |
assert!, assert_eq! | Prüfungen |
panic!, todo!, unreachable! | Abbrechen / Platzhalter |
dbg! | Debug-Ausgabe mit Position |
matches! | Muster als bool prüfen |
Formatierung
| Platzhalter | Ausgabe |
|---|---|
{} / {:?} / {:#?} | Display / Debug / hübsches Debug |
{:>8} / {:<8} / {:^8} | rechts / links / zentriert |
{:08.3} | Breite 8, 3 Nachkommastellen, mit Nullen |
/ / | hex / binär / wissenschaftlich |
{name} / {0} | benannt / positional |
Standard-Traits
Debug, Display, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, From, Into, Iterator, Drop, Add, Deref, AsRef, Send, Sync.
Cargo-Befehle
cargo new, run, build [--release], check, test, fmt, clippy, add, doc --open, update, publish.
Häufige Compilerfehler
| Fehler | Ursache / Lösung |
|---|---|
| E0382 borrow of moved value | Wert wurde verschoben: clone() oder leihen |
| E0499 two mutable borrows | zwei &mut gleichzeitig: Gültigkeit verkürzen |
| E0502 mutable and immutable borrow | lesen und schreiben gleichzeitig: trennen |
| E0308 mismatched types | Typ passt nicht: Umwandlung mit as, into, parse |
| E0106 missing lifetime specifier | Lifetime benennen |
| E0596 cannot borrow as mutable | mut fehlt |
Weiterlernen
- The Rust Programming Language (“das Buch”) auf doc.rust-lang.org/book
- Rust by Example und Rustlings (Übungen)
- Rust Playground (play.rust-lang.org) zum Ausprobieren
Merke
- Besitz, Leihen und Lifetimes sind das Herz von Rust
OptionundResultersetzen null und Exceptions- Traits und Generics statt Vererbung
- Cargo bündelt Build, Tests, Formatierung und Pakete
Quiz zur Selbstkontrolle
Wie viele veränderbare Referenzen auf denselben Wert dürfen gleichzeitig existieren?
- Eine (richtig)
- Beliebig viele
- Zwei
- Keine
Wofür steht der Operator ? bei Result?
- Fehler automatisch an den Aufrufer weitergeben (richtig)
- Wert ignorieren
- Fragen stellen
- Ein Makro aufrufen
Welches Werkzeug gibt Lint-Hinweise?
- cargo clippy (richtig)
- cargo lint
- rustfmt
- rustdoc
Weiter im Kurs
Zurück: Module, Cargo und Tests
Alle Kapitel: Rust im Überblick