Quali sono i tipi di ruggine indicati con un singolo apostrofo?


94

Ho incontrato diversi tipi in Rust indicati con un singolo apostrofo:

'static
'r
'a

Qual è il significato di quell'apostrofo? Forse è un modificatore di riferimenti ( &)? Digitazione generica specifica per i riferimenti? Non ho idea di dove si nasconda la documentazione per questo.



Il collegamento nel commento precedente non funziona più. Non so se sia equivalente: doc.rust-lang.org/book/lifetimes.html
Ellen Spertus

Anche il collegamento di Ellen ha smesso di funzionare: ecco quello nuovo (a giugno 2019): doc.rust-lang.org/book/ch10-03-lifetime-syntax.html

Risposte:


75

Queste sono le vite nominate di Rust.

Citando dal linguaggio di programmazione Rust :

Ogni riferimento in Rust ha una durata, che è l'ambito per il quale quel riferimento è valido. La maggior parte delle volte le vite sono implicite e dedotte, proprio come la maggior parte dei tipi di tempo vengono dedotti. Analogamente a quando dobbiamo annotare i tipi perché sono possibili più tipi, ci sono casi in cui la durata dei riferimenti potrebbe essere correlata in alcuni modi diversi, quindi Rust ha bisogno che annotiamo le relazioni utilizzando parametri di durata generici in modo che possa assicurarsi che il i riferimenti effettivi utilizzati in fase di esecuzione saranno sicuramente validi.

Le annotazioni a vita non cambiano la durata di vita di uno qualsiasi dei riferimenti coinvolti. Allo stesso modo in cui le funzioni possono accettare qualsiasi tipo quando la firma specifica un parametro di tipo generico, le funzioni possono accettare riferimenti con qualsiasi durata quando la firma specifica un parametro di durata generico. Quello che fanno le annotazioni di durata è mettere in relazione le vite di più riferimenti tra loro.

Le annotazioni di durata hanno una sintassi leggermente insolita: i nomi dei parametri di durata devono iniziare con un apostrofo '. I nomi dei parametri di durata sono generalmente tutti minuscoli e, come i tipi generici, i loro nomi sono generalmente molto brevi. 'aè il nome che la maggior parte delle persone usa come predefinito. Le annotazioni dei parametri di durata vanno dopo il &di un riferimento e uno spazio separa l'annotazione di durata dal tipo di riferimento.

Detto in un altro modo, una durata approssima l'intervallo di esecuzione durante il quale i dati a cui punta un riferimento sono validi. Il compilatore Rust dedurrà prudentemente la durata più breve possibile per essere sicuro. Se vuoi dire al compilatore che un riferimento dura più a lungo della stima più breve, puoi nominarlo, dicendo che il riferimento di output, ad esempio, ha la stessa durata di un dato riferimento di input.

La 'staticvita è una vita speciale, la più lunga di tutte le vite - per la durata del programma. Un tipico esempio sono le stringhe "letterali" che saranno sempre disponibili durante la vita del programma / modulo.

Puoi ottenere maggiori informazioni da questo gruppo di diapositive , a partire dalla diapositiva 29.

Lifetimes in Rust discute anche delle vite in modo approfondito.


0

Per aggiungere all'eccellente risposta di quux00, vengono utilizzate anche vite con nome per indicare l'origine di una variabile presa in prestito restituita al compilatore rust.

Questa funzione

pub fn f(a: &str, b: &str) -> &str {
  b
}

non verrà compilato perché restituisce un valore preso in prestito ma non specifica se lo ha preso in prestito da ao b.

Per risolvere questo problema, devi dichiarare una durata con nome e utilizzare la stessa durata per be il tipo restituito:

pub fn f<'r>(a: &str, b: &'r str) -> &'r str {
//      ----              ---         ---
  b
}

e usalo come previsto

f("a", "b")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.