返回包含可变值的结构
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 专门设计来绝对禁止的事情之一。
如果你想从一个函数中转移出的东西,必须满足以下两个条件之一:
它被存储在函数之外的某个地方,该函数将比当前调用更有效(例如,你被给定一个借用作为参数;returning 不算),或
您return拥有所有权,而不仅仅是借用参考。
更正后的 Foo
有效,因为它 拥有 Vec<i32>
。
我有以下代码,我在其中尝试 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 专门设计来绝对禁止的事情之一。
如果你想从一个函数中转移出的东西,必须满足以下两个条件之一:
它被存储在函数之外的某个地方,该函数将比当前调用更有效(例如,你被给定一个借用作为参数;returning 不算),或
您return拥有所有权,而不仅仅是借用参考。
更正后的 Foo
有效,因为它 拥有 Vec<i32>
。