首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当没有发生借用重叠时,为什么会出现借用错误?

当没有发生借用重叠时,为什么会出现借用错误?
EN

Stack Overflow用户
提问于 2019-04-30 22:18:29
回答 1查看 81关注 0票数 4

以下code失败,并出现借用错误:

代码语言:javascript
复制
extern crate chrono; // 0.4.6

fn main() {
    let mut now = chrono::Local::today();
    now = std::mem::replace(&mut now, now.succ());
}

错误是:

代码语言:javascript
复制
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()返回一个新对象,看起来succ()调用应该返回新对象,在replace发生可变借用之前结束不可变的借用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-30 22:38:59

参数的顺序很重要。例如,这是可行的:

代码语言:javascript
复制
/// 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);
}

(link to playground)

但在您的示例中,&mut now首先出现,并且在计算第二个参数时,它已经被借用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55922926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档