Livstider i structar
Lånade fält
Livstider i structar är en gratis lektion i Lär dig programmera i Rust på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lär dig programmera i Rust, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lär dig programmera i Rust innehåller totalt 4 lektioner.
Struktar kan låna
De flesta struktar äger sina data. Men en struktur kan också innehålla en referens till data som den inte äger. När den gör det behöver strukturen en livstidsparameter.
Det garanterar att strukturen aldrig lever längre än de lånade data.
Deklarera en livstid för en struktur
Lägg till livstiden inom vinkelparenteser efter strukturnamnet och använd den sedan för referensfältet. Detta anger att strukturen inte kan leva längre än referensen.
struct Excerpt<'a> {
text: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first = novel.split('.').next().unwrap();
let e = Excerpt { text: first };
println!("{}", e.text);
}Begränsningen som läggs till
Annoteringen betyder att en instans av Excerpt bara är giltig så länge strängen som den lånar fortfarande lever. Kompilatorn upprätthåller detta överallt där strukturen används.
Metoder på strukturer som lånar
Metoder på en sådan struktur innehåller också livstiden i impl-huvudet. Ofta kan du utelämna livstider i metodens kropp tack vare elision, som tas upp i nästa lektion.
struct Excerpt<'a> { text: &'a str }
impl<'a> Excerpt<'a> {
fn announce(&self) -> &str {
println!("Attention!");
self.text
}
}
fn main() {
let s = String::from("hello world");
let e = Excerpt { text: &s };
println!("{}", e.announce());
}Varför inte bara äga datan?
Att äga data, genom att använda String, är enklare och oftast att föredra. Att låna undviker kopiering av stora datamängder och är användbart för parsers och vyer som läser i befintliga buffertar.
Använd livstider i strukturer endast när det lönar sig att låna.
Exempel på en parser-vy
En struktur som innehåller slices in i en källsträng är ett klassiskt användningsområde. Den läser den ursprungliga bufferten utan att kopiera den.
struct Token<'a> {
word: &'a str,
}
fn main() {
let line = String::from("let x = 5");
let tokens: Vec<Token> = line.split_whitespace().map(|w| Token { word: w }).collect();
for t in &tokens {
println!("token: {}", t.word);
}
}Flera referensfält
En struktur kan innehålla flera referenser. De kan dela en livstid eller använda olika livstider, beroende på hur deras giltighet hänger ihop.
struct Pair<'a> {
left: &'a str,
right: &'a str,
}
fn main() {
let a = String::from("foo");
let b = String::from("bar");
let p = Pair { left: &a, right: &b };
println!("{} {}", p.left, p.right);
}Felet med en hängande struktur
Om de lånade data tas bort medan strukturen fortfarande finns kvar avvisar kompilatorn koden. Livstidsparametern är det som gör denna kontroll möjlig.
Returnera strukturer som lånar
En funktion som bygger en sådan struktur kopplar strukturens livstid till dess indata. Strukturen kan inte leva längre än de data som skickas in.
struct Wrap<'a> { inner: &'a str }
fn wrap<'a>(s: &'a str) -> Wrap<'a> {
Wrap { inner: s }
}
fn main() {
let text = String::from("wrapped");
let w = wrap(&text);
println!("{}", w.inner);
}Avvägningen mellan ägda och lånade data
Snabbguide:
- Behöver du behålla data fristående? Äg dem (
String,Vec). - Behöver du en kortlivad vy över befintliga data? Låna dem med en livstid.
Mental modell
En struktur med 'a är som en självhäftande lapp på någon annans anteckningsbok: den är bara meningsfull så länge anteckningsboken finns kvar. Rust ser till att du aldrig läser en lapp på en anteckningsbok som har försvunnit.
Snabbkontroll
Testa din förståelse av livstider i strukturer.
Sammanfattning
Du har lärt dig om livstider i strukturer:
- En struktur som innehåller en referens behöver en livstidsparameter
- Livstiden kopplar strukturens giltighet till de lånade data
- Metoder innehåller livstiden i
impl-huvudet - Föredra att äga data, om inte lån undviker betydande kopiering
Lär dig Rust med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 39
- Lektioner
- 144
Vanliga frågor
Är lektionen ”Livstider i structar” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lär dig programmera i Rust, inklusive ”Livstider i structar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lär dig programmera i Rust innehåller totalt 4 lektioner.
Vad lär jag mig i ”Livstider i structar”?
Lånade fält Ni övar på Lär dig programmera i Rust med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Lär dig programmera i Rust?
Du behöver inga förkunskaper. Utbildningen i Lär dig programmera i Rust på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Livstider i structar”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Lär dig programmera i Rust-lektionen?
Ja. Varje Lär dig programmera i Rust-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför livstider
- Livstidsannoteringar
- Livstider i structar
- Elideringsregler