2015-07-06 9 views
11

Ho un po 'di codice con cui sto combattendo. È una piccola funzione di supporto che dovrebbe restituire un Vec<&str> alla funzione di chiamata. Tuttavia, non riesco a ottenere la vita giusta.Expanding Rust Lifetime

Ecco il frammento di codice:

fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> &'a mut TokenList<'a> { 
    let out = TokenList::<'a>::new(); 

    out.push(current.as_str()); 
    out.push(ch); 

    *current = String::new(); 

    &mut out 
} 

Il compilatore mi sta dicendo: error: 'out' does not live long enough e che il riferimento deve essere valido per tutta la durata del 'a, ma sembra a me come esso è definito per 'a.

ho anche provato a cambiare a:

let out = &mut TokenList::<'a>::new(); 

che non cambia nessuno dei messaggi di errore. Oppure:

let out = &'a mut TokenList::<'a>::new(); 

che al compilatore non piace affatto.

Come è possibile definire con una durata pari a 'a?

Per ulteriori dettagli, ecco la mia definizione di ListaToken:

pub type Token<'a> = &'a str; 
pub type TokenList<'a> = Vec<Token<'a>>; 
+4

In breve, le vite descrivono solo per quanto tempo qualcosa vive, non influenza mai quanto a lungo vive. – delnan

+0

Peccato. Questa sarebbe una bella caratteristica. Grazie! – wmaxlees

risposta

11

La durata di out non è 'a, dal momento che out è distrutto al termine della funzione. Ruggine non ti consentirà di restituire un riferimento (consentirà l'accesso alla memoria liberata!).

provare a cambiare la vostra funzione al seguente:

fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> TokenList<'a> { 
    let out = TokenList::<'a>::new(); 

    out.push(current.as_str()); 
    out.push(ch); 

    *current = String::new(); 

    out 
} 

In questo modo si passerà la proprietà del out al chiamante e che vivrà abbastanza a lungo.

+0

Ahhh, mi sento stupido. Per qualche ragione, stavo pensando a '& str' come qualcosa come una stringa e un wrapper anche se' 'indica chiaramente che è un riferimento. Ora che ho apportato la correzione, è abbastanza chiaro che ho bisogno di tornare indietro e ridefinire il mio tipo di dati iniziale e propagare tale modifica attraverso il mio codice. Grazie! – wmaxlees

+0

Nessun problema! Credo che sentirsi stupidi sia un chiaro effetto dell'apprendimento: P ... specialmente quando si impara Rust! – aochagavia