以下代码因借用错误而失败:
extern crate chrono; // 0.4.6
fn main() {
let mut now = chrono::Local::today();
now = std::mem::replace(&mut now, now.succ());
}
Run Code Online (Sandbox Code Playgroud)
错误是:
extern crate chrono; // 0.4.6
fn main() {
let mut now = chrono::Local::today();
now = std::mem::replace(&mut now, now.succ());
}
Run Code Online (Sandbox Code Playgroud)
为什么这里会出现借用错误?now.succ()返回一个新对象,看起来调用succ()应该返回新对象,在可变借用发生之前结束不可变借用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);
}
Run Code Online (Sandbox Code Playgroud)
(链接到游乐场)
但在您的示例中,&mut now首先出现,并且在评估第二个参数时,它已经被借用了。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |