Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

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

#[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>.

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

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