Tür çıkarımı
- Rust kursu
- Orta seviye
- Ders 43/115
- 4 dk
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 f64Generic 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")); // 5Closure'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
fn main() {
// buraya yaz
}Örnek çözüm
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ü
let uzunluk = |s: &str| ____ { s.chars().count() };
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 |