为什么没有发生借用重叠时会出现借用错误?
Why is there a borrow error when no borrowing overlap is occurring?
以下 code 因借用错误而失败:
extern crate chrono; // 0.4.6
fn main() {
let mut now = chrono::Local::today();
now = std::mem::replace(&mut now, now.succ());
}
错误是:
error[E0502]: cannot borrow `now` as immutable because it is also borrowed as mutable
--> src/lib.rs:5:39
|
5 | now = std::mem::replace(&mut now, now.succ());
| ----------------- -------- ^^^ immutable borrow occurs here
| | |
| | mutable borrow occurs here
| mutable borrow later used by call
这里为什么会出现借位错误? now.succ()
return 是一个新对象,看起来 succ()
调用应该 return 新对象,在可变借用发生之前结束不可变借用 replace
.
参数的顺序很重要。例如,这有效:
/// Same as `std::mem::replace`, but with the reversed parameter order.
pub fn replace<T>(src: T, dest: &mut T) -> T {
std::mem::replace(dest, src)
}
fn main() {
let mut now = chrono::Local::today();
now = replace(now.succ(), &mut now);
}
但是在你的例子中,&mut now
先出现,在评估第二个参数时,它已经被借用了。
以下 code 因借用错误而失败:
extern crate chrono; // 0.4.6
fn main() {
let mut now = chrono::Local::today();
now = std::mem::replace(&mut now, now.succ());
}
错误是:
error[E0502]: cannot borrow `now` as immutable because it is also borrowed as mutable
--> src/lib.rs:5:39
|
5 | now = std::mem::replace(&mut now, now.succ());
| ----------------- -------- ^^^ immutable borrow occurs here
| | |
| | mutable borrow occurs here
| mutable borrow later used by call
这里为什么会出现借位错误? now.succ()
return 是一个新对象,看起来 succ()
调用应该 return 新对象,在可变借用发生之前结束不可变借用 replace
.
参数的顺序很重要。例如,这有效:
/// Same as `std::mem::replace`, but with the reversed parameter order.
pub fn replace<T>(src: T, dest: &mut T) -> T {
std::mem::replace(dest, src)
}
fn main() {
let mut now = chrono::Local::today();
now = replace(now.succ(), &mut now);
}
但是在你的例子中,&mut now
先出现,在评估第二个参数时,它已经被借用了。