Перевірка запозичення
Перевірка запозичень у 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 також покладається на це обмеження для оптимізації коду. Наприклад, значення за спільним посиланням можна безпечно кешувати у регістрі на весь час існування цього посилання.
- Перевірку запозичень розроблено з урахуванням багатьох поширених шаблонів, таких як одночасне отримання ексклюзивних посилань на різні поля у структурі. Але бувають ситуації, коли вона не зовсім "розуміє що відбувається", і це часто призводить до "боротьби з перевіряльником запозичень".