CodeBlanks Logo Icon CodeBlanks

impl Trait

impl Trait ile parametre ve dönüş türü belirtirsin.

impl Trait

Dönüş konumunda impl Trait, "bu trait'i uygulayan tek bir somut tür döndürüyorum, ama adını söylemiyorum" demektir. Yineleyiciler ve closure'lar gibi adı çok uzun ya da yazılamayan türleri döndürmek için kullanılır:

fn ciftler(n: u32) -> impl Iterator<Item = u32> {
    (0..n).filter(|x| x % 2 == 0)
}

fn carpan(k: i32) -> impl Fn(i32) -> i32 {
    move |x| x * k
}

ciftler'in gerçek türü Filter<Range<u32>, {closure}>'dir; closure türlerinin adı hiç yazılamaz.

Çağıran ne görür?

Çağıran yalnızca trait'in sunduklarını kullanabilir; bu, iç ayrıntıyı değiştirme özgürlüğü verir:

let v: Vec<u32> = ciftler(10).collect();   // [0, 2, 4, 6, 8]
let uc_kat = carpan(3);
println!("{}", uc_kat(7));                  // 21

move, closure'ın k'yi kopyalayarak sahiplenmesini sağlar; fonksiyon bittiğinde k yok olacağı için gereklidir.

Uygulama Gizli dönüş türleri

Yukarıdaki ciftler ve carpan fonksiyonlarını yaz. ciftler(10) sonucunu vektöre topla ve carpan(3) ile 7'yi çarp; ikisini boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn ciftler(n: u32) -> impl Iterator<Item = u32> {
    (0..n).filter(|x| x % 2 == 0)
}

fn carpan(k: i32) -> impl Fn(i32) -> i32 {
    move |x| x * k
}

fn main() {
    let v: Vec<u32> = ciftler(10).collect();
    let uc_kat = carpan(3);
    println!("{:?} {}", v, uc_kat(7));
}

Beklenen çıktı

[0, 2, 4, 6, 8] 21

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>fn f(b: bool) -&gt; impl Display { if b { 5 } else { "beş" } }</code> neden derlenmez?

  • if ifade değildir
  • Derlenir
  • impl Trait tek bir somut tür olmalı; i32 ve &str farklı Doğru cevap
  • Display döndürülemez

Açıklama: Farklı türleri döndürmek için Box<dyn Display> gibi dinamik dağıtım gerekir.

2 Yineleyici döndür

Soru
fn ciftler(n: u32) -> ____ {
    (0..n).filter(|x| x % 2 == 0)
}
Cevap
fn ciftler(n: u32) -> impl Iterator<Item = u32> {
    (0..n).filter(|x| x % 2 == 0)
}

Açıklama: impl Iterator<Item = u32>, u32 üreten adı gizli bir yineleyici döndürür.

3 Dönüş türü ve anlamı

Kavram Anlamı
-> impl Iterator<Item = u32> Gizli yineleyici
-> impl Fn(i32) -> i32 Gizli closure
-> Box<dyn Display> Farklı türler olabilir
-> Vec<u32> Somut, sahip olunan

Orta seviye bölümündeki tüm dersler