【发布时间】:2018-09-06 06:31:17
【问题描述】:
如何返回一个位于不可变引用后面的可变引用,作为参数传递给函数,如何处理?
struct Foo { i: i32 }
struct Bar<'b> {
f: &'b mut Foo
}
impl<'a: 'b, 'b> Bar<'b> {
fn func(&'a self) -> &'b mut Foo {
self.f
}
}
fn main() {
let mut foo = Foo { i: 1 };
let bar = Bar { f: &mut foo };
bar.func();
}
给出以下错误:
error[E0389]: cannot borrow data mutably in a `&` reference
--> src/main.rs:9:14
|
8 | fn func(&'a self) -> &'b mut Foo {
| -------- use `&'a mut self` here to make mutable
9 | self.f
| ^^^^^^ assignment into an immutable reference
我(有点)理解编译器在这里试图阻止什么。但我对错误消息 assignment into an immutable reference 感到困惑。 self(或self.f 的内部?)究竟分配了什么?
我写了下面的代码来模拟这个问题,得到了同样的错误信息,与上面的不同,我能够理解。代码如下:
fn main() {
let mut foo = Foo { i: 1 };
let bar = Bar { f: &mut foo };
let pbar = &bar;
pbar.f.i = 2; // assignment into an immutable reference
}
在第一个示例中,它是否试图将可变引用 f 移出 self(因为 &mut 不是 Copy 类型),将其视为不可变引用 self 中的突变,因此出现错误消息assignment into an immutable reference?
【问题讨论】:
-
如果允许,您可以使用两个共享引用来创建两个可变引用。
标签: reference rust immutability mutable