12
这里发生了什么(playground)?不能借用不可变因为它也借用函数参数中的可变
struct Number {
num: i32
}
impl Number {
fn set(&mut self, new_num: i32) {
self.num = new_num;
}
fn get(&self) -> i32 {
self.num
}
}
fn main() {
let mut n = Number{ num: 0 };
n.set(n.get() + 1);
}
给出了这样的错误:
error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable
--> <anon>:17:11
|
17 | n.set(n.get() + 1);
| - ^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
但是如果你只是简单的代码更改为这它的工作原理:
fn main() {
let mut n = Number{ num: 0 };
let tmp = n.get() + 1;
n.set(tmp);
}
对我来说,那些看起来完全等同 - 我的意思是,我希望前者在编译过程中转换为后者。在评估下一级函数调用之前,Rust是否评估所有函数参数?
你可以在这里找到借用检查过程的细节(https://github.com/rust-lang/rust/tree/master/src/librustc_borrowck/borrowck)。 – ljedrz
解决方法有[unborrow macro](https://github.com/durka/unborrow),以及关于[reddit]的讨论(https://www.reddit.com/r/rust/comments/575tc7/why_does_rust_not_allow_disjoint_mutable_borrows /) – wimh
啊哈,谢谢wimh! – Timmmm