Tür çıkarımı
- Rust kursu
- Uzman
- Ders 5/46
- 4 dk
Hindley-Milner tarzı tür çıkarımı algoritmasını öğrenirsin.
Tür çıkarımı
Rust'ın tür çıkarımı bir fonksiyonun gövdesi içinde kısıt toplama ve birleştirme (unification) ile çalışır: türü bilinmeyen her ifade bir tür değişkeni alır, kullanımlar bu değişkenler arasında eşitlik kısıtları oluşturur ve çözücü hepsini aynı anda çözer. Bu yüzden bilgi "sonradan" da gelebilir:
let a = 5; // a: ?T (tamsayı)
let b: u16 = a; // kısıt: ?T = u16 → a: u16
let mut v = Vec::new(); // Vec<?U>
v.push('ç'); // ?U = charÇıkarım fonksiyon sınırını geçmez: imzalar her zaman açıkça yazılır. Bu, hata mesajlarını yerel ve API'leri kararlı tutar.
Çıkarımı gözlemlemek
Çıkarılan türü görmenin pratik yolları: IDE ipuçları (rust-analyzer), bilerek tür hatası yapmak (let () = x; derleyiciye türü söyletir) ya da boyuta bakmak:
let a = 5;
let _b: u16 = a;
println!("{}", std::mem::size_of_val(&a)); // 2: a, u16 olarak çıkarıldı
let mut v = Vec::new();
v.push('ç');
println!("{}", std::mem::size_of_val(&v[0])); // 4: charUygulama Sonradan gelen bilgi
let a = 5; tanımla ve onu u16 türlü bir değişkene ata. Boş bir Vec::new()'e 'ç' ekle. size_of_val(&a) ve size_of_val(&v[0]) sonuçlarını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let a = 5;
let _b: u16 = a;
let mut v = Vec::new();
v.push('ç');
println!("{} {}", std::mem::size_of_val(&a), std::mem::size_of_val(&v[0]));
}Beklenen çıktı
2 4
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hiçbir kısıt yoksa <code>let x = 5;</code> hangi türü alır?
- i32 (tamsayı varsayılanı) Doğru cevap
- i64
- usize
- Derleme hatası
Açıklama: Tamsayı sabitleri için varsayılan i32, ondalıklılar için f64'tür; yalnızca başka kısıt yoksa uygulanır.
2 Değerin boyutu
let a = 5;
let _b: u16 = a;
println!("{}", std::mem::____(&a)); // 2
let a = 5;
let _b: u16 = a;
println!("{}", std::mem::size_of_val(&a)); // 2
Açıklama: size_of_val bir değerin bayt boyutunu verir.
3 Kod ve çıkarılan tür
| Kavram | Anlamı |
|---|---|
let x = 5; |
i32 |
let y = 2.0; |
f64 |
let a = 5; let b: u16 = a; |
a: u16 |
Vec::new() + push('ç') |
Vec<char> |