Rust'da sabit ifadeler (const), programın çalıştırılmadan önce bir parçası haline gelen değerler oluşturulmasına izin verecek şekilde derleme aşamasında hesaplanır. Bu tür ifadeler, dizilerin boyutlarını belirlemek, statik yapıların içindeki değerleri tanımlamak, generic parametreleri ve değişmez sabitlerin kesin bilinen değerlere ihtiyaç duyulan diğer durumlarda kullanılır.
Rust'da, diğer const ifadeler içinde kullanılabilecek veya sabit değişkenlerin başlatılmasında kullanılabilecek "sabit" fonksiyonlar (const fn) oluşturulabilir. Derleyici, bu tür bir ifadenin geçersiz işlemler içermediğinden (örneğin bellek erişimi) emin olma garantisi verir.
Örnek:
const fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => fib(n - 1) + fib(n - 2), } } const F8: u32 = fib(8); const ARR: [u32; F8 as usize] = [0; F8 as usize]; // Boyut 34 olan dizi
Bu örnekte F8'in değeri ve ARR dizisinin boyutu derleme aşamasında hesaplanmaktadır.
const fonksiyon ile normal fonksiyon arasındaki fark nedir ve her fonksiyonu const fn olarak ilan edebilir miyiz?
Cevap:
Hayır, her fonksiyonu const fn olarak ilan edemezsiniz. const fn, yan etkileri veya bellekle çalışma gerektirmeyen sadece izin verilen işlemleri içerebilir. Örneğin, const fn içinde bir dosya açamaz veya dinamik olarak bellek tahsis edemezsiniz.
const fn add(x: i32, y: i32) -> i32 { x + y // geçerli } // bu derlenmeyecek: const fn fail() -> String { // hata! String::from("err") }
Hikaye
Bir projede, sabit bir fonksiyon aracılığıyla bir dizenin hash değerini derleme aşamasında hesaplamaya çalıştılar, ancak bu fonksiyon içinde standart yöntemler kullanarak
HashMapve bellek tahsisi yaptılar. Program derlenmedi,const fniçindeki işlemlerin geçersiz olduğuna dair belirsiz hatalar verildi.
Hikaye
Büyük bir gömülü geliştirmede, bir geliştirici, derleme aşamasında hesaplanmasını gerektiren alanlara sahip bir sabit yapı tanımladı, ancak tanımlama sırasında
const fnolarak işaretlenmemiş bir dış crate fonksiyonu kullandı. Bu, bu mantığı statik tampon boyutlarını tanımlamak için kullanma imkanını ortadan kaldırdı.
Hikaye
Kodu,
staticveconstarasındaki farkı karıştırarak, çalıştırma sırasında "sabit" bir değeri değiştirmeye çalıştılar ve belirsiz UB (Tanımsız Davranış) ile sonuçlandılar, çünkü Rust'da sabitler bellekte değerler olarak yer almaz, derleyici tarafından kullanım yerine göre yerleştirilir, bu da değişimlerini kesinlikle dışlar.