Расширение продолжительности жизни ржавчины
У меня есть немного кода, с которым я сражаюсь. Это небольшая вспомогательная функция, которая должна возвращать 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>>;
Ответы
Ответ 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
вызывающему абоненту, и он будет жить достаточно долго.