Освободите заимствования в Русте

Я пробую Rust и у меня есть некоторые проблемы с пониманием "заимствования".

fn main() {
    let mut x = 10;
    let mut a = 6;
    let mut y = &mut x;

    *y = 6;
    y = &mut a;

    x = 15;
    println!("{}", x);
}

И у меня есть ошибка:

error[E0506]: cannot assign to `x` because it is borrowed
 --> <anon>:9:5
  |
4 |     let mut y = &mut x;
  |                      - borrow of `x` occurs here
...
9 |     x = 15;
  |     ^^^^^^ assignment to borrowed `x` occurs here

error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
  --> <anon>:10:20
   |
4  |     let mut y = &mut x;
   |                      - mutable borrow occurs here
...
10 |     println!("{}", x);
   |                    ^ immutable borrow occurs here
11 | }
   | - mutable borrow ends here

Как я могу выпустить x от "y-borrowing "?

1 ответ

Решение

В настоящее время это является ограничением средства проверки Rust заимствований, часто называемого "нелексическими временами жизни" (NLL). Проблема здесь в том, что когда вы назначаете ссылку на переменную (let mut y = &mut x;) ссылка должна быть действительной для всей области видимости переменной. Это означает, что "х заимствовано" длится для всего объема y, Таким образом, компилятор не заботится о строке y = &mut a;!

Вы можете прочитать намного больше (технических) обсуждений по этому вопросу здесь, в проблеме отслеживания.

Другие вопросы по тегам