返回包含可变值的结构

时间:2015-04-13 05:14:48

标签: rust

我有以下代码,我正在尝试使用字段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);

1 个答案:

答案 0 :(得分:17)

这里有两个问题。

首先,您不需要使用&mut来使结构字段可变。在Rust中,可变性是继承的。也就是说,如果你有一个Foo存储在一个可变变量(let mut f: Foo)中,它的字段是可变的;如果它在一个不可变的变量(let f: Foo)中,它的字段是不可变的。解决方案是使用:

struct Foo {
    values: Vec<i32>,
}

并按值返回Foo

第二个问题(以及实际编译错误的来源)是您尝试将借用返回到您在函数中创建的内容。这不可能。不,没有办法绕过它;你不能以某种方式延长initial的生命周期,返回initial以及借用不起作用。真。这是Rust专门设计为绝对禁止的事情之一。

如果你想传递一个 out 的功能,那么两件事之一必须是真的:

  1. 它被存储在函数之外的某个地方,它将比当前调用更长(例如,你是给予借用作为参数;返回并不算数),或者

  2. 您将返回所有权,而不仅仅是借来的参考资料。

  3. 更正的Foo有效,因为拥有 Vec<i32>