Я застрял со следующим кодом:
pub fn get_all<'a>() -> Vec<DesktopEntry<'a>> {
let all_desktop_files = filesystem::get_all_desktop_files();
all_desktop_files
.into_iter()
.filter_map(|desktop_file| {
let ini_option = load_ini(desktop_file);
match ini_option {
Some(ini) => convert_ini_to_desktop_entry(&ini), // <--
None => None,
}
}).collect::<Vec<DesktopEntry>>()
}
fn convert_ini_to_desktop_entry<'a>(ini: &'a Ini) -> Option<DesktopEntry> {
let section = match ini.section(Some("Desktop Entry")) {
Some(s) => Some(s),
None => None,
};
let name = match section {
Some(s) => match s.get("Name") {
Some(p) => Some(p),
None => None,
},
None => None,
};
Some(DesktopEntry {
name: name.unwrap(),
})
}
И ошибка на &ini
времени жизни:
borrowed value does not live long enough
...note: borrowed value must be valid for the lifetime 'a as defined on the function body at 10:5...
Я понимаю, что &ini
живет не так долго, как нужно. Но я действительно не понимаю, как это исправить. В книге есть рекомендации как исправить:
the best fix would be to return an owned data type rather than a reference
Но функции convert_ini_to_desktop_entry
требовалось время жизни для ее результата и параметра. И я не понимаю, почему ini
в этой функции нельзя владеть значением.