Обмеження трейту
При роботі з узагальненнями ви часто потребуєте, щоб типи реалізовували деякий трейт, щоб ви могли викликати методи цього трейту.
Ви можете зробити це за допомогою 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)
є некоректним.