rust - 扩展 Rust 生命周期

标签 rust lifetime

我有一些代码需要处理。这是一个应该返回 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>>;

最佳答案

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 的所有权传递给调用者,并且它会存在足够长的时间。

关于rust - 扩展 Rust 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252851/

相关文章:

iterator - 如何编写返回对自身的引用的迭代器?

rust - 尝试实现 supertrait 中声明的函数时出错

rust - 在 Rust 2018 中跨模块调用函数时出现 "unresolved import"

rust - 我怎样才能将一个值从参数中移出到 Drop::drop()?

rust - 借用的值在使用通用生命周期时生命周期不够长。

rust - 递归类型-生命周期问题

rust - Rust中二叉树的广度优先遍历

rust - 将 'key exists' 与 'and if its the right type' 解析 toml 结合的惯用方式

rust - 使用HashMap实现在迭代器上映射的函数的生命周期问题

rust - 在嵌套的 lambda 中借用局部变量