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).