Перевірка запозичення

Перевірка запозичень у Rust'і накладає обмеження на способи, якими ви можете запозичувати значення. Для певного значення, у будь-який час:

  • Ви можете мати одне або декілька спільних посилань на значення, або
  • Ви можете мати лише одне ексклюзивне посилання на значення.
fn main() {
    let mut a: i32 = 10;
    let b: &i32 = &a;

    {
        let c: &mut i32 = &mut a;
        *c = 20;
    }

    println!("a: {a}");
    println!("b: {b}");
}
This slide should take about 10 minutes.
  • Зверніть увагу, що вимога полягає в тому, що конфліктуючі посилання не повинні існувати в тій самій момент часу. Не має значення, де посилання буде розіменовано.
  • Наведений вище код не компілюється, оскільки a запозичено як мутабельну змінну (через c) і як немутабельну (через b) одночасно.
  • Перемістіть інструкцію println! для b перед областю видимості, яка вводить c, щоб забезпечити компіляцію коду.
  • Після цієї зміни компілятор розуміє, що b використовується тільки перед новим мутабельним запозиченням a через c. Це функція перевірки запозичень під назвою "нелексичні терміни життя".
  • Обмеження ексклюзивного посилання є досить сильним. Rust використовує його для запобігання гонці даних. Rust також покладається на це обмеження для оптимізації коду. Наприклад, значення за спільним посиланням можна безпечно кешувати у регістрі на весь час існування цього посилання.
  • Перевірку запозичень розроблено з урахуванням багатьох поширених шаблонів, таких як одночасне отримання ексклюзивних посилань на різні поля у структурі. Але бувають ситуації, коли вона не зовсім "розуміє що відбувається", і це часто призводить до "боротьби з перевіряльником запозичень".