No, non può farlo. Ci sono almeno due spiegazioni perché è così.
Innanzitutto, ricorda che i riferimenti sono presi in prestito, cioè indicano alcuni dati ma non li possiedono, sono di proprietà di qualcun altro. In questo caso particolare, la stringa, una sezione a cui si desidera tornare, è di proprietà della funzione perché è memorizzata in una variabile locale.
Quando la funzione termina, tutte le sue variabili locali vengono distrutte; ciò comporta chiamare i distruttori e il distruttore di String
libera la memoria utilizzata dalla stringa. Tuttavia, si desidera restituire un riferimento preso in prestito che punta ai dati allocati per quella stringa. Significa che il riferimento restituito diventa immediatamente pendente - punta a una memoria non valida!
La ruggine è stata creata, tra le altre cose, per prevenire tali problemi. Pertanto, in Rust è impossibile restituire un riferimento che punta in variabili locali della funzione, che è possibile in linguaggi come C.
C'è anche un'altra spiegazione, leggermente più formale. Diamo un'occhiata a vostra firma funzione:
fn return_str<'a>() -> &'a str
Ricordate che tutta la vita e parametri generici sono, beh, parametri: sono impostati dal chiamante della funzione. Per esempio, qualche altra funzione può chiamare in questo modo:
let s: &'static str = return_str();
Questo richiede 'a
essere 'static
, ma è ovviamente impossibile - la funzione non restituisce un riferimento ad una memoria statica, restituisce un riferimento con una vita strettamente inferiore. Pertanto, tale definizione di funzione non è corretta ed è vietata dal compilatore.
In ogni caso, in tali situazioni è necessario restituire un valore di un tipo di proprietà, in questo caso particolare sarà una proprietà String
:
fn return_str() -> String {
let mut string = String::new();
for _ in 0..10 {
string.push_str("ACTG");
}
string
}
Altre domande hanno lo stesso problema, e la risposta è sempre la stesso: non è possibile costruire un 'String' in una funzione e restituirlo come' & str' a causa del modello di memoria Rust. – Levans
Il tuo ragionamento per non voler restituire una stringa non ha senso per me. Basta memorizzare un 'String' in questo oggetto" statico "invece di un' & str'. È più facile, è almeno ergonomico, ha più senso per la proprietà e non ha nemmeno un vantaggio in termini di prestazioni. – delnan
@delnan In realtà hai risposto qualcos'altro di cui mi stavo chiedendo, ovvero se l'uso di '' String'' ha degli svantaggi in termini di prestazioni. Dovrei essere in grado di ridefinire l'uso di '' String''s – anderspitman