我有一点代码,我正在与之斗争.这是一个小助手函数,应该向调用函数返回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定义的.

我还try 将其改为:

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将不允许您返回对它的引用(它将允许访问已释放的内存!).

try 将功能更改为以下内容:

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相关问答推荐

as操作符如何将enum转换为int?

如何在 struct 中填充缓冲区并同时显示它?

在HashMap中插入Vacant条目的可变借位问题

MutexGuard中的过滤载体不需要克隆

限制未使用的泛型导致编译错误

在Rust中声明和定义一个 struct 体有什么区别

如何迭代属性以判断相等性?

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

信号量释放后 Rust 输出挂起线程

使用占位符获取用户输入

如何在 Rust 中打印 let-else 语句中的错误?

Rust:为什么 Pin 必须持有指针?

如何将 C++ 程序链接到 Rust 程序,然后将该 Rust 程序链接回 C++ 程序? (cpp -> rust -> cpp)

从光标位置旋转精灵

在 Rust 中,我如何处理请求 javascript 的页面?

当你删除一个存在于堆栈中的值时,为什么 rust 不会抱怨

在运行时在 Rust 中加载字体

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

Rust:为什么在 struct 中borrow 引用会borrow 整个 struct?

为什么 `ref` 会导致此示例*取消引用*一个字段?