【发布时间】:2017-08-10 06:50:08
【问题描述】:
如果我有一个封装两个成员的结构,并根据另一个更新一个,那么只要我这样做就可以了:
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 很复杂怎么办?
在我的理解中更重要的是,编译器从这里拯救了我什么样的内存不安全?
【问题讨论】:
标签: rust borrow-checker memory-safety