Ограничение трейта
При работе с обобщениями часто нужно требовать, чтобы типы реализовывали некоторый трейт, чтобы можно было вызывать его методы.
Это можно сделать с помощью T: Trait:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
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.
-
Попробуйте создать
NotCloneableи передать его вduplicate. -
Когда нужно несколько трейтов, соедините их через
+. -
Покажите предложение
where: студенты встретятся с ним при чтении кода.// Copyright 2022 Google LLC // SPDX-License-Identifier: Apache-2.0 fn duplicate<T>(a: T) -> (T, T) where T: Clone, { (a.clone(), a.clone()) }- Оно разгружает сигнатуру функции, если параметров много.
- У него есть дополнительные возможности, которые делают его мощнее.
- Если кто-то спросит, дополнительная возможность в том, что тип слева от «:» может быть произвольным, например
Option<T>.
- Если кто-то спросит, дополнительная возможность в том, что тип слева от «:» может быть произвольным, например
-
Обратите внимание, что Rust пока не поддерживает специализацию. Например, при исходной
duplicateдобавить специализированнуюduplicate(a: u32)некорректно.