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 paraduplicate
. -
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>
.
- Se alguém perguntar, o recurso extra é que o tipo à esquerda de ":" pode ser arbitrårio, como
-
Observe que o Rust ainda não suporta especialização. Por exemplo, dada a função
duplicate
original, é invålido adicionar uma especializaçãoduplicate(a: u32)
.