ЛЕКЦІЯ 14

Заимствование (Borrowing) и References

Рецензія: Ownership детально

План

  • Reference типи
  • Borrow checker правила
  • Практичні приклади

Reference

Reference

Pointer без risk. Вказує на дані без власництва. &T (immutable), &mut T (mutable).

Immutable references

let s = String::from("hello");
let r1 = &s;  // immutable reference
let r2 = &s;  // OK: можна багато
let r3 = &s;  // OK

println!("{}, {}, {}", r1, r2, r3);  // Все OK

Mutable references

let mut s = String::from("hello");
let r = &mut s;  // mutable reference
r.push_str(" world");
println!("{}", r);  // OK

// let r2 = &mut s;  // ERROR: можна тільки одна &mut!

Правила Reference

Reference Scopes

Dangling references

// WRONG: функція повертає reference на local variable
// fn dangle() -> &String {
//   let s = String::from("hi");
//   &s  // ERROR: s видаляється по завершені функції
// }

// RIGHT: повертаємо значення
fn no_dangle() -> String {
  let s = String::from("hi");
  s  // Move: переносимо власність
}

Borrow Checker

Borrow Checker

Частина компілятора, яка перевіряє правила reference на compile-time.

Reference порівняння

[object Object]
[object Object]

Запитання 1

Скільки immutable references можуть існувати одночасно?

  • Тільки одна
  • Максимум два
  • Скільки угодно
  • Залежить від типу
✅ Правильна відповідь: Скільки угодно

Запитання 2

Можна ли мати &s и &mut s водночас?

  • Так, завжди OK
  • Ні, помилка компіляції
  • Тільки якщо вони у різних scope
✅ Правильна відповідь: Ні, помилка компіляції

Помилка: Змішані references

⚠️ ЗАСТЕРЕЖЕННЯ

❌ Неправильно

✓ Правильно

Підсумки

  • &T: immutable reference, can be many
  • &mut T: mutable reference, only one
  • Borrow Checker запобігає data races at compile-time
  • References гарантують memory safety

Далі

Наступна лекція:

Лекція 15: Structures и Enums

Дякую за увагу! 💾

← Повернутися до списку лекцій