Как использовать собственные данные в моем коде. Заемная стоимость не живет достаточно - PullRequest
0 голосов
/ 08 сентября 2018

Я застрял со следующим кодом:

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 в этой функции нельзя владеть значением.

...