Rust dilinde, diğer birçok modern programlama dili gibi, programcının zaman kazanmasına ve tekrarlayan kod miktarını azaltmasına yardımcı olan bir tür çıkarım sistemi (type inference) bulunmaktadır. Bu sistem, Rust'ın başından itibaren, her durumda değişkenin türünü açıkça belirtmek zorunda kalmadan statik tiplemeyi kolaylaştırmak için mevcut olmuştur.
Type inference, kodu daha kısa ve verimli hale getirse de, sık veya kontrolsüz kullanımı belirsiz hatalara, okunabilirliğin azalmasına ve beklenmeyen performans sorunlarına yol açabilir. Derleyici, bazı yerlerde türü doğru veya kesin bir şekilde çıkaramayabilir. Rust'ın bazı yapıları, türleri açıkça belirtmenizi gerektirir, aksi takdirde kod derlenmez.
Rust, yerel (yerel scope) ve bağlamsal tür çıkarımını destekler. Tür çıkarımı genellikle değişkenler, fonksiyonlar tarafından döndürülen değerler ve fonksiyonlar içindeki let ifadeleri için çalışır. Diğer tüm durumlarda (örneğin, yapıların tanımlanması, fonksiyon imzaları, generic fonksiyonlar) türler açıkça belirtilmelidir.
Kod örneği:
let x = 10; // x: i32 (varsayılan) let y = vec!["hello", "world"]; // y: Vec<&str> fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T { a + b } let sum = add(2u16, 3u16); // sum: u16
Anahtar özellikler:
Rust derleyicisi, dönen değer türü açıkça belirtilmeden bir fonksiyonun türünü çıkarabilir mi?
Hayır, fonksiyon imzasında dönen değer türü her zaman açıkça belirtilmelidir, aksi takdirde derleme hatası alınır.
// Hata alınacak: fn func() { 42 } // Böyle olmalı: fn func() -> i32 { 42 }
Kolleksiyonlar veya referanslarla çalışırken tamamen tür çıkarımına güvenilir mi?
Sıklıkla, belirsizlikleri önlemek veya gerekli türü elde etmek için açık bir anotasyon gereklidir, özellikle mutable/immutable referanslarla ve karmaşık generic koleksiyonlarla çalışırken.
let data = Vec::new(); // data: Vec<()> — her zaman beklenen tür değil let numbers: Vec<i32> = Vec::new(); // açıkça belirtilmiş
Kapalı alanlar (closures) ve fonksiyon parametreleri kullanırken tür çıkarımı nasıl çalışır?
Derleyici, kapalı alan parametrelerinin türlerini bağlamdan çıkarabilir, ancak her zaman değil — bazen tüm anotasyonu gereklidir.
let plus_one = |x| x + 1; // hata: x türü çıkarılamadı let plus_one = |x: i32| x + 1; // derlenir
Geliştirici, tamamen anotasyonsuz parametreler ve tür belirtmeyen yerel değişkenler içeren bir API fonksiyonu yazdı; tüm kod tür çıkarımına dayanıyordu. Ekip, parametrelerin hangi türleri beklediği ve fonksiyonun gerçekte ne döndürdüğü konusunda çok sayıda özel hata ve karmaşıklıkla karşılaştı.
Artılar:
Eksiler:
Diğer bir ekip, tür çıkarımını yalnızca basit ifadelerdeki yerel değişkenler için kullandı ve tüm kamu API'lerinde, generic yapılarda ve fonksiyonlarda her zaman türleri net bir şekilde belirtti. Sonuç olarak, kodun bakımı ve anlaşılması önemli ölçüde iyileşti ve hata sayısı azaldı.
Artılar:
Eksiler: