首先,我要为这个没有具体标题的初学者问题道歉,我对Rust还很陌生。
无论如何,这里是一些(可行的)代码:
struct A {
data: i32
}
struct B<'s> {
a: &'s A
}
impl<'s> B<'s> {
fn new(reference: &'s A) -> B<'s> {
B {
a: reference
}
}
}
fn main() {
let a1 = A{data: 0};
let b1 = B::new(&a1);
let b2 = B::new(&a1);
}
有一个包含一些数据的结构体A,还有一个包含对A不可变引用的结构体B。在主方法中,创建了几个具有引用相同A对象的B对象。
现在我只想改变一件事:在B::new()方法中,在将其用作B的不可变成员之前,我想修改'reference'的数据。我尝试过以下方式:
struct A {
data: i32
}
struct B<'s> {
a: &'s A
}
impl<'s> B<'s> {
fn new(reference: &'s mut A) -> B<'s> {
// Modify data
reference.data += 1;
B {
a: reference
}
}
}
fn main() {
let mut a1 = A{data: 0};
let b1 = B::new(&mut a1);
let b2 = B::new(&mut a1);
}
但编译器不允许我这样做,出现错误: 一次性不能将a1
作为可变引用借用多次。为什么在new()完成后,可变借用没有结束呢?如何才能正确地实现我想要的功能?