Почему переменная не живет достаточно долго?
Рассмотрим эту функцию, которая должна возвращать расширение файла данногоPath
.
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
}
}
Сообщение об ошибке выглядит следующим образом:
`path_str` does not live long enough
Сообщение об ошибке довольно ясно, и это позор, я не могу решить это самостоятельно. Я понимаю это в теории, но есть еще несколько размытых вещей для меня.
Я понимаю, что компилятор хочет сказать мне, чтоpath_str
не живет достаточно долго, чтобы быть действительным, так как возвращаемое значение с помечается как время жизни'a
.
Но это то, где это останавливается для меня:
Я понимаю, что ссылка наpath
(входной параметр) должен жить ровно столько, сколько ссылка наstr
это завернуто вOption
(выходной параметр)
так как мы вернемсяSome(path_str.as_slice().slice_from(start))
Я предполагаю, что на практике это означает, чтоpath_str
нужно жить так долго, какpath
.
Что я не понимаю, так этопочему именно делаетpath_str
не прожить достаточно долго и как я могу это исправить? Что заставляет его скоро умереть?
ОБНОВИТЬ
Как указано в комментариях, а также на IRC, удалив лишнееas_slice()
делает код компилируемым Кто-нибудь знает, почему это так? Было также отмечено, что существуетметод чтобы получить расширение напрямую. Но да, я на самом деле больше интересуюсь изучением истории проблемы.