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