Обмеження трейту

При роботі з узагальненнями ви часто потребуєте, щоб типи реалізовували деякий трейт, щоб ви могли викликати методи цього трейту.

Ви можете зробити це за допомогою T: Trait:

fn duplicate<T: Clone>(a: T) -> (T, T) {
    (a.clone(), a.clone())
}

// struct NotCloneable;

fn main() {
    let foo = String::from("foo");
    let pair = duplicate(foo);
    println!("{pair:?}");
}
This slide should take about 8 minutes.
  • Спробуйте зробити NonCloneable і передати його в duplicate.

  • Якщо потрібно вказати декілька трейтів, використовуйте +, щоб об'єднати їх.

  • Покажіть вираз where, студенти зустрінуться з ним під час читання коду.

    fn duplicate<T>(a: T) -> (T, T)
    where
        T: Clone,
    {
        (a.clone(), a.clone())
    }
    • Це розчищає сигнатуру функції, якщо у вас багато параметрів.
    • Він має додаткові функції, що робить його більш потужним.
      • Якщо хтось запитає, додаткова можливість полягає в тому, що тип ліворуч від ":" може бути довільним, наприклад Option<T>.
  • Зауважте, що Rust (поки що) не підтримує спеціалізацію. Наприклад, за наявності оригінального duplicate додавання спеціалізованого duplicate(a: u32) є некоректним.