【发布时间】:2017-05-02 10:06:57
【问题描述】:
这里发生了什么 (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 不会在评估下一级函数调用之前评估所有函数参数吗?
【问题讨论】:
-
您可以找到借阅检查过程的详细信息here。
-
有一个unborrow macro 用于解决方法,并在reddit 上进行讨论
-
看看这个blog post。它深入地解释了这个问题。有更多关于该问题的信息的后续帖子。
标签: rust borrow-checker