Turbofish
- Rust kursu
- Orta seviye
- Ders 11/115
- 4 dk
::<> 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 2Uygulama 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
fn main() {
// buraya yaz
}Örnek çözüm
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::<Vec<_>>()</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
let n = "42".parse____().unwrap();
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 |