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
NonClonablee 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
duplicateoriginal, é inválido adicionar uma especializaçãoduplicate(a: u32).