我有下面的代码,我试图返回 struct Foo,其中包含字段values的一组默认值.这些值可能会在以后更改.但编者抱怨:

error: `initial` does not live long enough

如何做到这一点?还有别的 Select 吗?

struct Foo <'a> {
    values: &'a mut Vec<i32>,
}

impl <'a> Foo <'a> {
    fn new() -> Foo <'a> {
        let initial = vec![1, 2];

        Foo { values: &mut initial }
    }
}

let my_foo = Foo::new();

my_foo.values.push(3);

推荐答案

这里有两个问题.

首先,不需要使用&mut来使 struct 字段可变.Rust 的易变性为inherited.也就是说,如果Foo存储在可变变量(let mut f: Foo)中,则其字段是可变的;如果它位于不可变变量(let f: Foo)中,则其字段是不可变的.解决方案是只使用:

struct Foo {
    values: Vec<i32>,
}

然后返回一个Foo的值.

第二个问题(以及实际编译错误的来源)是,您试图将borrow 返回到您在函数中创建的内容.这里是impossible.不,没有办法绕过它;你不能以某种方式延长initial岁的生命周期 ,归还initial岁,否则借钱就行不通了.真正地这是铁 rust 被专门设计用来绝对禁止的事情之一.

如果你想传递函数中的某个值,必须满足以下两个条件之一:

  1. 它被存储在函数之外的某个地方,该函数将比当前调用更有效(例如,作为一个参数,您被borrow 了given次;返回不算在内),或者

  2. 你将返回ownership,而不仅仅是借来的参考资料.

修正后的Foo行得通,因为它比Vec<i32>行得通.

Rust相关问答推荐

包含嵌套 struct 的CSV

rust 迹-内存管理-POP所有权-链表

通过解引用将值移出Box(以及它被脱糖到什么地方)?

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

为什么';t std::cell::ref使用引用而不是非空?

如何将带有嵌套borrow /NLL 的 Rust 代码提取到函数中

随机函数不返回随机值

使用 pyo3 将 Rust 转换为 Python 自定义类型

如何限制 GtkColumnView 行数

一次不能多次borrow *obj作为可变对象

Rust:`sort_by` 多个条件,冗长的模式匹配

在 Rust 中,Weak 如何知道内部值何时被删除?

打印 `format_args!` 时borrow 时临时值丢失

为什么我不能克隆可克隆构造函数的Vec?

为什么 match 语句对引用类型比函数参数更挑剔?

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

使用 `.` 将 T 转换为 &mut T?

如果我立即等待,为什么 `tokio::spawn` 需要一个 `'static` 生命周期?

在传输不可复制的值时实现就地枚举修改

加入动态数量的期货