Подтвердить что ты не робот

Расширение продолжительности жизни ржавчины

У меня есть немного кода, с которым я сражаюсь. Это небольшая вспомогательная функция, которая должна возвращать Vec<&str> вызывающей функции. Однако, похоже, я не могу получить прав на всю жизнь.

Вот фрагмент кода:

fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> &'a mut TokenList<'a> {
    let out = TokenList::<'a>::new();

    out.push(current.as_str());
    out.push(ch);

    *current = String::new();

    &mut out
}

Компилятор говорит мне: error: 'out' does not live long enough и что ссылка должна быть действительной для времени жизни 'a, но мне кажется, что она определена для 'a.

Я также попытался изменить его на:

let out = &mut TokenList::<'a>::new();

который не изменяет никаких сообщений об ошибках. Или:

let out = &'a mut TokenList::<'a>::new();

который компилятор вообще не любит.

Как определить out, чтобы иметь время жизни 'a?

Для более подробной информации, вот мое определение TokenList:

pub type Token<'a> = &'a str;
pub type TokenList<'a> = Vec<Token<'a>>;
4b9b3361

Ответ 1

Время жизни out не 'a, так как out уничтожается в конце функции. Rust не позволит вам вернуть ссылку на него (это позволит получить доступ к свободной памяти!).

Попробуйте изменить свою функцию на следующее:

fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> TokenList<'a> {
    let out = TokenList::<'a>::new();

    out.push(current.as_str());
    out.push(ch);

    *current = String::new();

    out
}

Таким образом вы передадите права собственности out вызывающему абоненту, и он будет жить достаточно долго.