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); }
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) ilefoo.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.