Узагальнені трейти
Трейти також можуть бути загальними, так само як типи та функції. Параметри трейту отримують конкретні типи під час його використання.
#[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>
. -
Узагальнені трейти приймають типи як "вхідні", тоді як асоціативні типи є своєрідним "вихідним" типом. Трейт може мати декілька реалізацій для різних вхідних типів.
-
Ведеться робота над додаванням цієї підтримки, яка називається спеціалізація.