Trait impl

Semelhante aos limites de trait, a sintaxe do trait impl pode ser usada em argumentos de funçÔes e em valores de retorno:

// CĂłdigo simplificado para:
//   fn add_42_millions<T: Into<i32>>(x: T) -> i32 {
fn add_42_millions(x: impl Into<i32>) -> i32 {
    x.into() + 42_000_000
}

fn pair_of(x: u32) -> impl std::fmt::Debug {
    (x + 1, x - 1)
}

fn main() {
    let many = add_42_millions(42_i8);
    println!("{many}");
    let many_more = add_42_millions(10_000_000);
    println!("{many_more}");
    let debuggable = pair_of(27);
    println!("debuggable: {debuggable:?}");
}
This slide should take about 5 minutes.

O impl Trait permite que vocĂȘ trabalhe com tipos que vocĂȘ nĂŁo pode nomear. O significado de impl Trait Ă© um pouco diferente nas diferentes posiçÔes.

  • Como parĂąmetro, o trait impl Ă© como um parĂąmetro genĂ©rico anĂŽnimo com um limitador de caracterĂ­sticas (trait).

  • Como tipo de retorno, significa que o tipo de retorno Ă© algum tipo concreto que implementa o trait, sem nomear o tipo. Isso pode ser Ăștil quando vocĂȘ nĂŁo deseja expor o tipo concreto em uma API pĂșblica.

    A inferĂȘncia Ă© difĂ­cil na posição de retorno. Uma função que retorna impl Foo escolhe o tipo concreto que retorna, sem escrevĂȘ-lo na fonte. Uma função que retorna um tipo genĂ©rico como collect<B>() -> B pode retornar qualquer tipo que satisfaça B, e o chamador pode precisar escolher um, como com let x: Vec<_> = foo.collect() ou com o turbofish, foo.collect::<Vec<_>>().

Qual Ă© o tipo de debuggable? Tente let debuggable: () = .. para ver o que a mensagem de erro mostra.