CodeBlanks Logo Icon CodeBlanks

Tür çıkarımı

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: char

Uygulama 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

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

Örnek çözüm

main.rs
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

Soru
let a = 5;
let _b: u16 = a;
println!("{}", std::mem::____(&a));   // 2
Cevap
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>

Uzman bölümündeki tüm dersler