Variablen & Datentypen
Variablen in Rust sind standardmaessig unveraenderbar. Lerne let, mut, Shadowing und die primitiven Typen von Rust.
Inhaltsverzeichnis
Variablen & Datentypen in Rust
Rust hat ein paar Eigenarten bei Variablen, die dich am Anfang ueberraschen werden - aber sie sind der Grund, warum Rust so wenig Fehler zulaesst.
Variablen sind standardmaessig unveraenderbar
let x = 5;
x = 6; // FEHLER! cannot assign twice to immutable variable `x`
Das ist Absicht. Wenn der Compiler weiss, dass sich ein Wert nicht aendert, kann er staerkere Garantien geben und oft besseren Code erzeugen.
mut fuer veraenderbare Variablen
Wenn du eine Variable aendern willst, musst du das explizit sagen:
let mut x = 5;
x = 6; // OK
println!("{}", x); // 6
Dieser kleine Unterschied macht deine Absicht beim Lesen des Codes sofort klar.
Konstanten
const ist nicht dasselbe wie let. Konstanten:
- haben einen expliziten Typ
- sind zur Kompilierzeit bekannt
- werden
SCREAMING_SNAKE_CASEbenannt
const MAX_PUNKTE: u32 = 100_000;
Shadowing
Du kannst let mehrfach mit demselben Namen verwenden. Das nennt sich Shadowing - die alte Variable wird โueberschattetโ:
let x = 5;
let x = x + 1; // x ist jetzt 6
let x = x * 2; // x ist jetzt 12
println!("x = {}", x); // x = 12
Das ist etwas anderes als mut! Bei Shadowing entsteht eine neue Variable - der Typ darf sich sogar aendern:
let wert = "42"; // &str
let wert: i32 = wert.parse().unwrap(); // i32
Die primitiven Datentypen
Ganzzahlen
Rust hat vorzeichenbehaftete (i) und vorzeichenlose (u) Integer in verschiedenen Groessen:
| Typ | Bereich |
|---|---|
i8 | -128 bis 127 |
i16 | -32768 bis 32767 |
i32 | ca. -2 Mrd. bis 2 Mrd. (Default) |
i64 | sehr gross |
u8 | 0 bis 255 |
u32 | 0 bis ca. 4 Mrd. |
usize | so breit wie dein System (32/64 Bit) |
let alter: u32 = 28;
let temperatur: i16 = -5;
let million = 1_000_000; // Default ist i32
Fliesskommazahlen
Zwei Varianten: f32 und f64 (Default - doppelte Genauigkeit).
let pi = 3.14159; // f64
let kleiner: f32 = 0.5; // f32
Booleans
let aktiv = true;
let fertig: bool = false;
Character
Ein einzelnes Unicode-Zeichen in einfachen Anfuehrungszeichen, 4 Bytes gross:
let buchstabe = 'R';
let emoji = '๐ฆ';
Wichtig: Strings ("Text") sind kein char! Das lernen wir gleich.
Tupel
Feste Sammlung verschiedener Typen:
let person: (String, i32, bool) = ("Anna".to_string(), 28, true);
let name = &person.0; // Zugriff per Index
let alter = person.1;
// Oder destrukturieren:
let (name, alter, aktiv) = person;
Arrays
Feste Groesse, alle Elemente gleicher Typ:
let zahlen: [i32; 5] = [1, 2, 3, 4, 5];
let nullen = [0; 10]; // 10 Nullen
println!("{}", zahlen[0]); // 1
Fuer eine veraenderbare Liste nimmst du stattdessen Vec<T> (lernen wir spaeter).
Strings - kurze Vorschau
In Rust gibt es zwei wichtige String-Typen:
let gruss: &str = "Hallo"; // String-Slice
let name: String = String::from("Rust"); // besitzter String
let voll = format!("{}, {}!", gruss, name); // "Hallo, Rust!"
Warum zwei Typen? Das haengt mit Ownership zusammen - dazu spaeter mehr.
Typ-Inferenz
Du musst Typen selten angeben. Der Compiler leitet sie meistens aus dem Kontext ab:
let alter = 28; // i32 (Default)
let pi = 3.14; // f64 (Default)
let aktiv = true; // bool
let name = "Anna"; // &str
Explizite Typen brauchst du, wenn:
- Der Compiler sie nicht herleiten kann (z.B. bei
parse()) - Du einen anderen Typ willst als den Default
- Du deinen Code dokumentieren willst
Uebersicht
let= unveraenderbar (Default)let mut= veraenderbarconst= zur Kompilierzeit bekannt, mit expliziter Typangabe- Shadowing erlaubt Mehrfach-
letund Typwechsel - Rust hat praezise Integer-Typen (
i8..i64,u8..u64) - Arrays haben feste Groesse, Vec
ist flexibel
Im naechsten Kapitel: Kontrollstrukturen wie if, else und Schleifen.