如果我有一个封装了两个成员变量的结构体,并且基于其中一个更新另一个,只要我按照以下方式进行更新,那就没问题:
也就是说,当我直接引用
编译器报错:
如果我需要做比仅返回成员更复杂的操作以获取
更重要的是,编译器从哪种内存不安全中拯救了我?
struct A {
value: i64
}
impl A {
pub fn new() -> Self {
A { value: 0 }
}
pub fn do_something(&mut self, other: &B) {
self.value += other.value;
}
pub fn value(&self) -> i64 {
self.value
}
}
struct B {
pub value: i64
}
struct State {
a: A,
b: B
}
impl State {
pub fn new() -> Self {
State {
a: A::new(),
b: B { value: 1 }
}
}
pub fn do_stuff(&mut self) -> i64 {
self.a.do_something(&self.b);
self.a.value()
}
pub fn get_b(&self) -> &B {
&self.b
}
}
fn main() {
let mut state = State::new();
println!("{}", state.do_stuff());
}
也就是说,当我直接引用
self.b
时。但是当我将do_stuff()
更改为以下内容时:pub fn do_stuff(&mut self) -> i64 {
self.a.do_something(self.get_b());
self.a.value()
}
编译器报错:
cannot borrow `*self` as immutable because `self.a` is also borrowed as mutable
。如果我需要做比仅返回成员更复杂的操作以获取
a.do_something()
的参数,我必须创建一个通过值返回b
并将其存储在绑定中的函数,然后将该绑定传递给do_something()
吗?如果b
很复杂怎么办?更重要的是,编译器从哪种内存不安全中拯救了我?
get_b
移动到B
的策略并没有想到过我,但在这种情况下它非常有效,因为State
的目的是完全封装A
和B
。非常感谢。 - Leonora Tindall