Rust'ta tür dönüştürmesi (type casting) as anahtar kelimesi ile gerçekleştirilir. Bu, bir türü diğerine açıkça dönüştürür:
let x: i32 = 10; let y: u8 = x as u8;
Rust, C veya C++ gibi örtük dönüşümleri (implicit cast) gerçekleştirmez. Bu, veri kaybı veya taşma sorunlarıyla ilgili birçok hatayı önler.
Özellikler:
Potansiyel tehlikeler:
i32'den u8'e dönüştürme sırasında değer aralığını aşarsa, fazla yüksek bitler basitçe atılır — bu beklenmedik davranışlara yol açabilir.Örnek:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, çünkü 300 % 256 = 44
i8türünden negatif bir sayıyıasanahtar kelimesi ileu8türüne dönüştürürseniz ne olur?
Cevap: Değer, derleme hatası veya çalışma zamanı panik oluşturmaz. Bunun yerine, değer bitleri işaretsiz bir sayı olarak yorumlanır:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
Hikaye
Finansal bir uygulamada aktarım miktarı verileri başlangıçta i32 olarak saklanıyordu. Geliştirici bu verileri sınır kontrolleri yapmadan u32'ye dönüştürmeye karar verdi ve bu, negatif değerlerin hatalı işlenmesine neden oldu — değerler beklenmedik şekilde büyük pozitif sayılara dönüşerek iş mantığı doğrulamasını geçti!
Hikaye
Mikrodenetleyici oyununda hız seviyelerinin değiştirilmesi, iki seviye değerinin farkı olarak hesaplandı: sonuç negatif olabiliyordu. Sonucu yuvarlamak için as u8 dönüşümü kullanıldı ve taşmalar göz ardı edildi. Sonuç olarak, negatif değerler wrap-around davranışından dolayı büyük pozitif sayılara dönüştüğü için hızlar maksimum seviyede “dondu”.
Hikaye
Bir ağ uygulamasında veri tamponu kopyalanırken, uzunluk işaretçiler arasındaki fark (usize) olarak hesaplandı ve ardından as ile u32'ye dönüştürüldü. Büyük bellek alanlarında (>4 GB) bu, değerin kesilmesine neden oldu ve büyük dosyanın iletimi sırasında veri kaybı ve hatalara yol açtı.