Use trait bounds to constrain generic types by specifying required behavior using the : syntax or where clauses.
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}
Alternatively, use a where clause for complex constraints:
fn largest<T>(list: &[T]) -> &T
where
T: PartialOrd,
{
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}
For multiple traits, separate them with +:
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}