CodeBlanks Logo Icon CodeBlanks

Tür çıkarımı

Closure'larda tür çıkarımı ve ne zaman açık tür gerektiğini öğrenirsin.

Tür çıkarımı

Closure parametre ve dönüş türleri ilk kullanımdan çıkarılır ve sonra sabitlenir:

let ikile = |x| x * 2;
println!("{}", ikile(5));       // x: i32 olarak sabitlendi
// println!("{}", ikile(2.5));  // hata: beklenen i32, gelen f64

Generic bir fonksiyonun aksine closure tek bir türle çalışır. Farklı türler için ya ayrı closure'lar ya da generic bir fonksiyon gerekir.

Açık türler

Okunabilirlik ya da belirsizlik için türler açıkça yazılabilir. Dönüş türü yazılırsa gövde süslü parantez içinde olmalıdır:

let uzunluk = |s: &str| -> usize { s.chars().count() };
println!("{}", uzunluk("kitap"));   // 5

Closure'ların türü derleyicinin ürettiği adsız bir türdür; iki closure aynı imzaya sahip olsa bile türleri farklıdır.

Uygulama Çıkarım ve açık tür

Türü çıkarılan let ikile = |x| x * 2; ve türleri açık let uzunluk = |s: &str| -> usize { s.chars().count() }; closure'larını yaz. ikile(5) ve uzunluk("kitap") sonuçlarını boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let ikile = |x| x * 2;
    let uzunluk = |s: &str| -> usize { s.chars().count() };
    println!("{} {}", ikile(5), uzunluk("kitap"));
}

Beklenen çıktı

10 5

Soru ve cevaplar

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

1 <code>let f = |x| x;</code> hiç çağrılmazsa ne olur?

  • x i32 varsayılır
  • Uyarı verir yalnızca
  • Derleme hatası: x'in türü çıkarılamıyor Doğru cevap
  • f generic olur

Açıklama: Kullanım olmadan tür bilgisi yoktur; bu durumda türü açıkça yaz: |x: i32| x.

2 Dönüş türü

Soru
let uzunluk = |s: &str| ____ { s.chars().count() };
Cevap
let uzunluk = |s: &str| -> usize { s.chars().count() };

Açıklama: Closure dönüş türü -> ile yazılır ve gövde süslü parantez ister.

3 Kod ve sonuç

Kavram Anlamı
let f = |x| x * 2; f(5) 10
f(5); f(2.5) Tür hatası
let f = |x| x; (çağrısız) Çıkarım hatası
|s: &str| -> usize { .. } Açık türler

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