0Pricing
Learn Rust Coding · Lezione

Lifetime nelle struct

Campi presi in prestito

Lifetime nelle struct è una lezione Learn Rust Coding gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn Rust Coding, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn Rust Coding include 4 lezioni in totale.

Le struct possono prendere in prestito

La maggior parte delle struct possiede i propri dati. Tuttavia, una struct può anche contenere un riferimento a dati che non possiede. In questo caso, la struct ha bisogno di un parametro di lifetime.

Questo garantisce che la struct non sopravviva mai ai dati presi in prestito.

Dichiarare un lifetime su una struct

Aggiunga il lifetime tra parentesi angolari dopo il nome della struct, quindi lo utilizzi nel campo riferimento. Questo indica che la struct non può sopravvivere a quel riferimento.

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);
}

Il vincolo aggiunto

L'annotazione indica che un'istanza di Excerpt è valida solo finché è viva la stringa da cui prende in prestito i dati. Il compilatore lo fa rispettare in ogni punto in cui la struct viene utilizzata.

Metodi sulle struct che prendono in prestito

Anche i metodi di una struct di questo tipo riportano il lifetime nell'intestazione di impl. Spesso è possibile omettere i lifetime nel corpo del metodo grazie all'elisione, che verrà trattata nella prossima lezione.

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());
}

Perché non possedere semplicemente i dati?

Possedere i dati (usando String) è più semplice e in genere preferibile. Prendere in prestito evita di copiare grandi quantità di dati ed è utile per parser e viste che accedono a buffer esistenti.

Ricorra ai lifetime nelle struct solo quando il prestito offre un vantaggio.

Esempio di vista di un parser

Una struct che contiene slice all'interno di una stringa sorgente è un caso d'uso classico. Legge il buffer originale senza copiarlo.

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);
    }
}

Più campi riferimento

Una struct può contenere diversi riferimenti. Possono condividere un unico lifetime oppure usarne di distinti, a seconda della relazione tra la loro validità.

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);
}

L'errore della struct pendente

Se i dati presi in prestito vengono eliminati mentre la struct esiste ancora, il compilatore rifiuta il codice. Il parametro di lifetime rende possibile questo controllo.

Restituire struct che prendono dati in prestito

Una funzione che costruisce una struct di questo tipo lega la lifetime della struct a quella del suo input. La struct non può sopravvivere ai dati passati.

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);
}

Compromesso tra possesso e prestito

Guida rapida:

  • È necessario conservare i dati in modo indipendente? Ne assuma il possesso (String, Vec).
  • Serve una vista di breve durata su dati esistenti? Li prenda in prestito con una lifetime.

Modello mentale

Una struct con 'a è come un post-it attaccato al quaderno di qualcun altro: ha senso solo finché quel quaderno esiste. Rust garantisce che non si legga mai un post-it su un quaderno che non esiste più.

Verifica rapida

Verifichi la Sua comprensione delle lifetime nelle struct.

Riepilogo

Ha imparato a usare le lifetime nelle struct:

  • Una struct che contiene un riferimento ha bisogno di un parametro di lifetime
  • La lifetime lega la validità della struct ai dati presi in prestito
  • I metodi riportano la lifetime nell'intestazione di impl
  • È preferibile possedere i dati, a meno che prenderli in prestito eviti copie significative

Domande Frequenti

La lezione «Lifetime nelle struct» è gratuita?

Sì — il testo completo di «Lifetime nelle struct» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn Rust Coding, passa a CoddyKit PRO. Il corso Learn Rust Coding include 4 lezioni in totale.

Cosa imparerò in «Lifetime nelle struct»?

Campi presi in prestito Eserciti Learn Rust Coding con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Learn Rust Coding?

Non è richiesta alcuna esperienza precedente. Learn Rust Coding su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Lifetime nelle struct»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Learn Rust Coding?

Sì. Ogni lezione Learn Rust Coding include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché le lifetime
  2. Annotazioni delle lifetime
  3. Lifetime nelle struct
  4. Regole di elisione
← Torna a Learn Rust Coding