How to Use Trait Bounds to Constrain Generic Types

Constrain generic types in Rust by adding trait bounds using `T: Trait` or `where T: Trait` to enforce required behavior.

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
}