Por que a variável não vive por tempo suficiente?
Considere esta função que deve retornar a extensão do arquivo de um determinadoPath
.
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
}
}
A mensagem de erro é a seguinte:
`path_str` does not live long enough
A mensagem de erro é bastante clara e é uma pena que eu não possa resolver sozinha. Eu entendo isso em teoria, mas ainda existem algumas coisas borradas para mim.
Eu entendo que o compilador quer me dizer quepath_str
não vive o suficiente para ser válido, pois o valor de retorno com é marcado com a vida útil'a
.
Mas é aqui que para para mim:
Eu entendo que a referência apath
(o parâmetro de entrada) deve durar exatamente enquanto a referência aostr
embrulhado noOption
(o parâmetro de saída)
desde que voltamosSome(path_str.as_slice().slice_from(start))
Presumo que, na prática, isso significa quepath_str
precisa viver o tempo quepath
.
O que eu não entendo éporque exatamente fazpath_str
não viver o suficiente e como eu poderia consertar isso? O que faz morrer logo?
ATUALIZAR
Conforme apontado nos comentários e também no IRC, removendo os resíduos supérfluosas_slice()
faz o código compilar. Alguém sabe por que isso é? Também foi apontado que existe umamétodo para obter a extensão diretamente. Mas sim, na verdade, estou mais interessado em aprender a história por trás do problema.