CodeBlanks Logo Icon CodeBlanks

Turbofish

::<> ile tür çıkarımına yardımcı olursun.

Turbofish

Derleyici bir generic türü bağlamdan çıkaramadığında tür, fonksiyon ya da metot adından sonra ::<T> ile verilir. Bu sözdizimine "turbofish" denir:

let n = "42".parse::<i32>().unwrap();
let v = (1..4).collect::<Vec<i32>>();
let t = [1, 2, 3].iter().sum::<i32>();
let bos = Vec::<String>::new();

Aynı bilgi değişkene tür yazarak da verilebilir: let n: i32 = "42".parse().unwrap();. Zincirin ortasında değişken olmadığı için turbofish gerekir.

Neden gerekiyor?

parse ve collect dönüş türüne göre farklı davranır: parse i32, f64, bool ya da IpAddr üretebilir; collect Vec, String, HashSet ya da HashMap üretebilir. Derleyici hangisini istediğini bilmeden kodu üretemez:

let harfler = "abc".chars().collect::<String>();   // "abc"
let kume = [3, 1, 3].into_iter().collect::<std::collections::HashSet<_>>();
println!("{harfler} {}", kume.len());   // abc 2

Uygulama Sayıları ayıkla

let s = "1 2 3 4"; metnini boşluktan böl, her parçayı parse::<i32>() ile çevir ve collect::<Vec<_>>() ile topla. Toplamı sum::<i32>() ile hesapla; vektörü ve toplamı boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let s = "1 2 3 4";
    let v = s.split(' ').map(|x| x.parse::<i32>().unwrap()).collect::<Vec<_>>();
    let t = v.iter().sum::<i32>();
    println!("{:?} {}", v, t);
}

Beklenen çıktı

[1, 2, 3, 4] 10

Soru ve cevaplar

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

1 <code>collect::&lt;Vec&lt;_&gt;&gt;()</code> içindeki <code>_</code> ne anlama gelir?

  • Kullanılmayan değer
  • Eleman türünü derleyici çıkarsın Doğru cevap
  • Boş vektör
  • Her tür kabul edilir

Açıklama: Kap türünü (Vec) sen seçersin, eleman türünü derleyici yineleyiciden çıkarır.

2 Hedef türü ver

Soru
let n = "42".parse____().unwrap();
Cevap
let n = "42".parse::<i32>().unwrap();

Açıklama: Metot adından sonra ::<T> yazılır.

3 İfade ve sonuç

Kavram Anlamı
"7".parse::<u8>() Ok(7)
"ab".chars().collect::<String>() "ab"
[1, 2].iter().sum::<i32>() 3
Vec::<i32>::new().len() 0

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