返回包含可变值的结构

Returning a struct containing mutable values

我有以下代码,我在其中尝试 return 结构 Foo 具有字段 values 的一组默认值。这些值以后可能会更改。但是编译器抱怨:

error: `initial` does not live long enough

这是如何实现的?还有其他选择吗?

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 来使结构字段可变。可变性在 Rust 中是 继承的 。也就是说,如果你有一个 Foo 存储在一个可变变量 (let mut f: Foo) 中,它的字段是可变的;如果它在不可变变量 (let f: Foo) 中,则其字段是不可变的。解决方案是只使用:

struct Foo {
    values: Vec<i32>,
}

和 return 按值 Foo

第二个问题(也是实际编译错误的根源)是您试图 return 借用您在函数中创建的内容。这是不可能。不,没有办法解决它;您无法以某种方式延长 initial、returning initial 的生命周期,而且借用也不起作用。真的。这是 Rust 专门设计来绝对禁止的事情之一。

如果你想从一个函数中转移的东西,必须满足以下两个条件之一:

  1. 它被存储在函数之外的某个地方,该函数将比当前调用更有效(例如,你被给定一个借用作为参数;returning 不算),或

  2. 您return拥有所有权,而不仅仅是借用参考。

更正后的 Foo 有效,因为它 拥有 Vec<i32>