🔪 1. Slices: Sichten auf Daten ohne Allokations-Kosten
Ein Slice ist eine Referenz auf eine zusammenhängende Folge von Elementen in einer Collection, anstatt die gesamte Collection zu kopieren oder zu besitzen. Intern ist ein Slice ein Fat Pointer bestehend aus:
- Einem Zeiger (Pointer) auf das Start-Element
- Der Länge (Length) des Slices
let text = String::from("Rust Systems Engine");
// String Slices (&str) mit Range-Syntax
let rust = &text[0..4]; // "Rust"
let engine = &text[13..]; // "Engine" (bis zum Ende)
let full = &text[..]; // Gesamter String als &str
// Array Slices (&[i32])
let numbers = [10, 20, 30, 40, 50];
let middle_slice: &[i32] = &numbers[1..4]; // [20, 30, 40]
Wenn du jemandem ein Zitat aus einem dicken Buch zeigen möchtest, reißt du nicht die Seite heraus und übergibst sie ihm (Ownership Move), noch kopierst du das ganze Buch im Copyshop (Clone). Du nimmst einen Textmarker und zeigst auf Zeile 5 bis 12: Das ist ein Slice!
⏳ 2. Warum braucht Rust Lifetimes?
Jede Referenz in Rust hat eine Lebensdauer (Lifetime). Der Borrow Checker vergleicht die Scopes, um sicherzustellen, dass keine Referenz länger lebt als die Daten, auf die sie zeigt (Verhinderung von Dangling References / Use-after-Free):
// ❌ INVALID: Referenz überlebt die Daten
/*
fn dangle() -> &String {
let s = String::from("hallo");
&s // FEHLER: `s` wird am Ende der Funktion gedroppt! Die Referenz zeigt ins Leere!
}
*/
Explizite Lifetime-Annotationen 'a
Wenn eine Funktion zwei Referenzen entgegennimmt und eine Referenz zurückgibt, kann der Compiler nicht wissen, welche Eingabe-Referenz zurückgeliefert wird. Mit 'a definieren wir die Beziehung der Gültigkeiten:
// 'a bedeutet: Der Rückgabe-Slice lebt mindestens so lange wie der KÜRZERE der beiden Inputs!
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() >= y.len() {
x
} else {
y
}
}
&str als Funktionsparameter bevorzugenSchreibe in Funktionen immer s: &str statt s: &String als Parameter. Ein &str akzeptiert dank Deref Coercion sowohl &String als auch String-Literale ("...") und Sub-Slices!