Почему возникает ошибка заимствования, если не происходит совпадения заимствования? - PullRequest
4 голосов
/ 30 апреля 2019

Следующий код завершается с ошибкой заимствования:

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() возвращает новый объект, и было бы похоже, что вызов succ() должен вернуть новый объект, завершить неизменяемый заем до того, как изменяемый заем произойдет с replace.

1 Ответ

3 голосов
/ 30 апреля 2019

Порядок аргументов имеет значение.Например, это работает:

/// 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 появляется первым, а при оценке второго параметра этоуже заимствовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...