Узагальнені трейти

Трейти також можуть бути загальними, так само як типи та функції. Параметри трейту отримують конкретні типи під час його використання.

#[derive(Debug)]
struct Foo(String);

impl From<u32> for Foo {
    fn from(from: u32) -> Foo {
        Foo(format!("Перетворено з цілого числа: {from}"))
    }
}

impl From<bool> for Foo {
    fn from(from: bool) -> Foo {
        Foo(format!("Перетворено з булевого значення: {from}"))
    }
}

fn main() {
    let from_int = Foo::from(123);
    let from_bool = Foo::from(true);
    println!("{from_int:?}, {from_bool:?}");
}
  • Трейт From буде розглянутий пізніше у курсі, але її визначення у документації std є простим.

  • Реалізації трейту не обов'язково повинні охоплювати всі можливі параметри типів. У цьому випадку Foo::from("hello") не буде скомпільовано, оскільки для Foo не існує реалізації From<&str>.

  • Узагальнені трейти приймають типи як "вхідні", тоді як асоціативні типи є своєрідним "вихідним" типом. Трейт може мати декілька реалізацій для різних вхідних типів.

  • Ведеться робота над додаванням цієї підтримки, яка називається спеціалізація.