ЛЕКЦІЯ 19

Traits и Generics

Рецензія: Модули

План

  • Generics для поліморфізму
  • Traits як інтерфейси
  • Trait bounds

Generics<T>

Generics

Поліморфні типи. Работают на compile-time з monomorphization.

Generic функція

fn largest(list: &[T]) -> T {
  let mut largest = list[0];
  for &item in list {
    if item > largest {
      largest = item;
    }
  }
  largest
}

let numbers = vec![34, 50, 25, 100, 65];
println!("{}", largest(&numbers));  // 100

Trait

Trait

Інтерфейс, який визначає набір методів. Як interface у Java/Go.

Trait визначення

trait Summary {
  fn summarize(&self) -> String;
  fn author(&self) -> String;  // без реалізації
}

struct Article {
  title: String,
  author: String,
}

impl Summary for Article {
  fn summarize(&self) -> String {
    format!("{} by {}", self.title, self.author)
  }
  fn author(&self) -> String {
    self.author.clone()
  }
}

Trait bounds

fn print_summary(item: &T) {
  println!("Breaking news: {}", item.summarize());
}

fn print_summaries(item: &T) {
  // T мусить мати як Summary так і Display
}

// Альтернативна синтаксис
fn print_it(item: &impl Summary) {
  println!("{}", item.summarize());
}

Стандартні Traits

Derive для traits

#[derive(Debug, Clone, PartialEq)]
struct Person {
  name: String,
  age: u32,
}

let p1 = Person { name: "Alice".into(), age: 30 };
let p2 = p1.clone();

println!("{:?}", p2);  // Debug output

Запитання 1

Чим Trait відрізняється від Struct?

  • Trait це інтерфейс, Struct - дані
  • Нічим не відрізняються
  • Trait швидше
✅ Правильна відповідь: Trait це інтерфейс, Struct - дані

Запитання 2

Що означає <T: Summary>?

  • T мусить реалізовувати Summary
  • T є Summary
  • T наслідує Summary
✅ Правильна відповідь: T мусить реалізовувати Summary

Помилка: Забув trait bound

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

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

✓ Правильно

Підсумки

  • Generics: поліморфізм типів
  • Traits: інтерфейси для контрактів
  • Trait bounds: обмеження generics
  • Zero-cost abstraction на compile-time

Далі

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

Лекція 20: Многопотоковість (Multithreading)

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

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