Lär dig programmera i Rust · Lektion

Livstider för säkra referenser

Fördjupa er i livstider, Rusts mekanism för att säkerställa att referenser alltid är giltiga och förhindra hängande pekare vid kompilering.

Lektion 3 av 311 steg

Livstider för säkra referenser är en gratis lektion i Lär dig programmera i Rust på CoddyKit. Detta är lektion 3 av 3. 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 3 lektioner.

Varför livstider är viktiga

Rusts regler för ägarskap och lån förhindrar många vanliga minnesfel. Men det finns ytterligare ett säkerhetslager: livstider.

Livstider ser till att referenser i din kod alltid pekar på giltig data. De löser problemet med hängande referenser, där en referens kan peka på minne som redan har frigjorts.

Risken med hängande pekare

Föreställ dig ett scenario där en funktion skapar data, returnerar en referens till den och sedan förstör datan när funktionen avslutas. Den returnerade referensen skulle då peka på ogiltigt minne.

Rust använder livstider för att förhindra detta vid kompilering. Språket kontrollerar att varje referens du använder förblir giltig så länge du behöver den, vilket garanterar minnessäkerhet.

Rust härleder livstider

Du behöver inte alltid skriva explicita livstidsannoteringar. Rust har en uppsättning regler för utelämning av livstider som låter kompilatorn härleda livstider i vanliga mönster.

I en funktion med en inkommande referens tilldelas dess livstid till exempel ofta automatiskt till den utgående referensen. Det gör koden renare!

När livstider måste anges

När Rust inte kan härleda livstider måste du ange dem explicit. Det talar om för kompilatorn hur livstiderna för olika referenser förhåller sig till varandra.

Syntaxen för en livstidsannotering är en apostrof följd av en liten bokstav, till exempel 'a. Det är en generisk parameter för livstider, inte en specifik tidslängd.

Livstidsparametrar för funktioner

När en funktion tar emot flera referenser och returnerar en behöver Rust veta vilken av de inkommande referensernas livstid den utgående referensen ska ha. Det säkerställer att den returnerade referensen alltid är giltig.

Syntaxen <'a> deklarerar en generisk livstidsparameter. Vi tittar på ett exempel:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
  if x.len() > y.len() {
    x
  } else {
    y
  }
}

fn main() {
  let string1 = String::from("abcd");
  let string2 = "xyz";
  let result = longest(string1.as_str(), string2);
  println!("The longest string is: {}", result);
}

Livstiden 'static

Livstiden 'static är ett specialfall. Den anger att en referens kan leva under hela programmets körning.

Strängliteraler (till exempel "hello world") har livstiden 'static eftersom de lagras direkt i programmets binärfil och är tillgängliga under hela körningen.

fn main() {
  // 'static lifetime for a string literal
  let s: &'static str = "I live for the entire program!";
  println!("{}", s);

  // This is also implicitly 'static
  let another_s = "Hello from static land!";
  println!("{}", another_s);
}

Structar som innehåller referenser

Om en struct innehåller en referens måste du lägga till en livstidsannotering i structens definition. Det säkerställer att ingen instans av structen lever längre än den data som dess referenser pekar på.

Structens livstidsparameter talar om för Rust att alla referenser i den måste ha minst den livstiden.

struct ImportantExcerpt<'a> {
  part: &'a str,
}

fn main() {
  let novel = String::from("Call me Ishmael. Some years ago...");
  let first_sentence = novel.split('.').next().expect("Could not find a '.'");
  let i = ImportantExcerpt {
    part: first_sentence,
  };
  println!("Excerpt part: {}", i.part);
}

Livstider med generiska typer

Livstider är en form av generiska parametrar! Du kan kombinera dem med generiska typer för att skapa flexibla och säkra datastrukturer eller funktioner.

En struct kan till exempel innehålla referenser till generiska typer, där alla begränsas av en enda livstidsparameter. På så sätt förblir komplexa datarelationer giltiga.

Tolka kompilatorfel

När du stöter på livstidsfel för första gången kan de verka skrämmande. Det vanligaste felet är "borrow might not live long enough".

Det betyder vanligtvis att du försöker använda en referens efter att datan den pekar på har tagits bort, eller att Rust inte kan bevisa att den är giltig. När du förstår dessa meddelanden blir det lättare att justera dina livstidsannoteringar.

Snabbtest: livstider

Vilket av följande beskriver bäst det grundläggande problem som Rusts explicita livstidsannoteringar är avsedda att lösa?

Livstider: säkerhet vid kompilering

Du har lärt dig att livstider är en viktig del av Rusts garantier för minnessäkerhet. De förhindrar hängande referenser genom att se till att alla referenser är giltiga under hela den tid de används.

  • Rust härleder ofta livstider med hjälp av regler för utelämning.
  • Du använder explicita annoteringar som 'a när härledning inte är möjlig.
  • Livstider är viktiga för funktioner som returnerar referenser och för structar som innehåller referenser.
  • Den särskilda livstiden 'static gäller under hela programmets körning.

Att behärska livstider är avgörande för att skriva robust Rust-kod!

Gratis att börja

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 för säkra referenser” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lär dig programmera i Rust, inklusive ”Livstider för säkra referenser”, 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 3 lektioner.

Vad lär jag mig i ”Livstider för säkra referenser”?

Fördjupa er i livstider, Rusts mekanism för att säkerställa att referenser alltid är giltiga och förhindra hängande pekare vid kompilering. 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 3.

Hur lång tid tar lektionen ”Livstider för säkra referenser”?

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

  1. Förstå Rusts ägarskapsmodell
  2. Referenser och lån förklarade
  3. Livstider för säkra referenser
← Tillbaka till Lär dig programmera i Rust