ЛЕКЦІЯ 13

Ownership детально: Move, Borrow, Lifetime

Рецензія: Основи володіння

План

  • Move семантика докладно
  • Borrow (借用) зміст
  • Lifetime як розв'язання

Move семантика

Move

Передача власництва від s1 до s2. s1 тепер invalid.

Move в функціях

fn takes_ownership(s: String) {
  println!("{}", s);
  // s видаляється тут
}

let s1 = String::from("hello");
takes_ownership(s1);  // s1 move в функцію
// println!("{}", s1);  // ERROR!

Borrow (заимствование)

Borrow

Тимчасово дати доступ без передачі власництва. &T (immutable borrow), &mut T (mutable borrow).

Borrow: Immutable & Mutable

let mut s = String::from("hello");
let r1 = &s;      // immutable borrow
let r2 = &s;      // OK: кілька immutable
println!("{}", r1);  // OK

let r3 = &mut s;  // mutable borrow
r3.push_str(" world");
println!("{}", r3);  // OK

Правила Borrow Checker

Lifetime

Lifetime

Синтаксис для визначення scope reference. Позначається 'a, 'b і т.д.

Lifetime в функціях

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
  if x.len() > y.len() { x } else { y }
}

let s1 = String::from("long");
let s2 = "short";
let result = longest(&s1, &s2);
println!("{}", result);

Ownership Flow

Move vs Borrow vs Copy

[object Object]
[object Object]
[object Object]
[object Object]

Запитання 1

Що буває з s1 після let s2 = s1 для String?

  • s1 все ще доступна
  • s1 становиться невалідною (move)
  • s1 копіюється
  • Помилка компіляції
✅ Правильна відповідь: s1 становиться невалідною (move)

Запитання 2

Скільки &mut borow можуть існувати одночасно?

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

Помилка 1: Повернення reference на local

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

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

✓ Правильно

Помилка 2: Два &mut одночасно

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

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

✓ Правильно

Підсумки

  • Move: передача власництва
  • Borrow: тимчасовий доступ (&, &mut)
  • Lifetime: контроль scope reference
  • Borrow Checker гарантує memory safety

Далі

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

Лекція 14: Заимствование і References

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

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