impl Trait

Özellik sınırlarına (trait bounds) benzer şekilde, fonksiyon argümanlarında ve geri dönüş değerlerinde bir impl Trait sözdizimi kullanılabilir:

// Sözdizimsel kolaylık:
//   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);
    dbg!(many);
    let many_more = add_42_millions(10_000_000);
    dbg!(many_more);
    let debuggable = pair_of(27);
    dbg!(debuggable);
}
This slide should take about 5 minutes.

impl Trait, isimlendiremeyeceğiniz türlerle çalışmanıza olanak tanır. impl Trait’in anlamı farklı konumlarda biraz farklıdır.

  • Bir parametre için, impl Trait bir özellik sınırına (trait bound) sahip anonim bir genelleştirilmiş (generic) parametre gibidir.

  • Bir geri dönüş türü için, bu, geri dönüş türünün, türü isimlendirmeden özelliği (trait) gerçekleştiren (implement) bir belirli (concrete) tür olduğu anlamına gelir. Bu, genel bir API’de belirli olan türü açığa çıkarmak istemediğinizde kullanışlı olabilir.

    Geri dönüş konumunda (return position) çıkarım (inference) yapmak zordur. impl Foo geri döndüren bir fonksiyon, geri döndürdüğü belirli olan türü kaynakta yazmadan seçer. collect<B>() -> B gibi genelleştirilmiş bir tür geri döndüren bir fonksiyon, B’yi sağlayan herhangi bir türü geri döndürebilir ve çağıranın, let x: Vec<_> = foo.collect() veya tür belirteciyle (turbo balığı / turbofish) ile foo.collect::<Vec<_>>() gibi birini seçmesi gerekebilir.

debuggable’ın türü nedir? Hata mesajının ne gösterdiğini görmek için let debuggable: () = ..’yi deneyin.