Trait Bounds (Limites de Trait)

Ao trabalhar com genéricos, muitas vezes você exigir que os tipos implementem algum trait para poder utilizar os métodos do trait.

Você consegue fazer isso com T:Trait ou impl Trait:

fn duplicate<T: Clone>(a: T) -> (T, T) {
    (a.clone(), a.clone())
}

// struct NotClonable;

fn main() {
    let foo = String::from("foo");
    let pair = duplicate(foo);
    println!("{pair:?}");
}
This slide should take about 8 minutes.
  • Tente criar um NonClonable e passá-lo para duplicate.

  • Quando vários traits são necessários, use + para uni-los.

  • Mostre uma cláusula where, estudantes irão encontrá-la quando lerem código.

    fn duplicate<T>(a: T) -> (T, T)
    where
        T: Clone,
    {
        (a.clone(), a.clone())
    }
    • Organiza a assinatura da função se você tiver muitos parâmetros.
    • Possui recursos adicionais tornando-o mais poderoso.
      • Se alguém perguntar, o recurso extra é que o tipo à esquerda de “:” pode ser arbitrário, como Option<T>.
  • Observe que o Rust ainda não suporta especialização. Por exemplo, dada a função duplicate original, é inválido adicionar uma especialização duplicate(a: u32).