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