Considerare questa funzione che dovrebbe restituire l'estensione del file di un dato Path
.Perché la variabile non vive abbastanza a lungo?
pub fn get_extension<'a>(path: &'a Path) -> Option<&'a str> {
let path_str = path.as_str().unwrap();
let ext_pos = regex!(".[a-z0-9]+$").find(path_str);
match ext_pos {
Some((start, _)) => {
return Some(path_str.as_slice().slice_from(start))
},
None => return None
}
}
Il messaggio di errore è la seguente:
`path_str` does not live long enough
messaggio L'errore è abbastanza chiaro ed è un peccato che non si può lavorare per conto mio. Lo capisco in teoria ma ci sono ancora un paio di cose sfocate per me.
Capisco che il compilatore vuole dirmi che path_str
non vive abbastanza a lungo da essere valido come il valore restituito con è contrassegnato con la durata 'a
.
Ma questo è dove si ferma per me:
Capisco che il riferimento al
path
(il parametro di ingresso) devono la vita esattamente fino a quando il riferimento alstr
che è avvolto nelOption
(il parametro di uscita)poiché restituiamo
Some(path_str.as_slice().slice_from(start))
presumo che in pratica ciò significa chepath_str
ha bisogno di vivere fino apath
.
Quello che non capisco è il motivo per cui esattamente fa path_str
non vive abbastanza a lungo e come potrei risolvere questo problema? Cosa lo fa morire presto?
UPDATE
Come sottolineato nei commenti e anche su IRC rimozione del superfluo as_slice()
rende il codice di compilazione. Qualcuno sa perchè è così? È stato anche sottolineato che esiste uno method per ottenere direttamente l'estensione. Ma sì, in realtà sono più interessato ad apprendere la storia dietro il problema.
Path_str è già una sezione in modo da poterla rimuovere as_slice e funzionerà. Questo è probabilmente un bug. – Arjan
Grazie. Questo ha fatto il trucco. Aggiorno la domanda di conseguenza. – Christoph