CodeBlanks Logo Icon CodeBlanks

const fn

const fn ile derleme zamanı hesap yapan fonksiyon yazarsın.

const fn

const fn, derleme anında çalıştırılabilen bir fonksiyondur. Sabitlerin, static'lerin ve dizi uzunluklarının değerini hesaplamak için kullanılabilir; normal çağrılarda ise sıradan bir fonksiyon gibi çalışır:

const fn kare(x: u32) -> u32 {
    x * x
}

const BOYUT: u32 = kare(4);           // derleme anında: 16
static TABLO: [u8; BOYUT as usize] = [0; BOYUT as usize];
let n = kare(5);                      // çalışma anında da olur

Derleme anında yapılan hesap programın çalışma süresine hiçbir şey eklemez.

Derleme anı tabloları

Döngüler ve koşullar const fn içinde kullanılabilir. Bu, arama tablolarını derleme anında üretmeyi sağlar:

const fn kareler<const N: usize>() -> [u32; N] {
    let mut t = [0; N];
    let mut i = 0;
    while i < N {
        t[i] = (i * i) as u32;
        i += 1;
    }
    t
}

const TABLO: [u32; 5] = kareler::<5>();   // [0, 1, 4, 9, 16]

for döngüsü yineleyici trait'ini kullandığı için const bağlamda henüz kullanılamaz; while kullanılır.

Uygulama Derleme anı boyutu

const fn kare(x: u32) -> u32 yaz ve const BOYUT: u32 = kare(4); tanımla. [0u8; BOYUT as usize] dizisi oluştur; BOYUT ve dizinin uzunluğunu boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
const fn kare(x: u32) -> u32 {
    x * x
}

const BOYUT: u32 = kare(4);

fn main() {
    let dizi = [0u8; BOYUT as usize];
    println!("{} {}", BOYUT, dizi.len());
}

Beklenen çıktı

16 16

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 const fn içinde hangisi kullanılamaz?

  • Aritmetik
  • Heap ayırma (Vec::push, Box::new) ve G/Ç Doğru cevap
  • if ve match
  • while döngüsü

Açıklama: Derleme anında yalnızca deterministik ve yan etkisiz işler yapılabilir; izin verilenler her sürümde genişliyor.

2 Derleme anı fonksiyonu

Soru
____ fn kare(x: u32) -> u32 {
    x * x
}
const BOYUT: u32 = kare(4);
Cevap
const fn kare(x: u32) -> u32 {
    x * x
}
const BOYUT: u32 = kare(4);

Açıklama: Sabit değer hesaplayabilmek için fonksiyon const fn olmalıdır.

3 İfade ve değerlendirilme anı

Kavram Anlamı
const B: u32 = kare(4); Derleme anı
let n = kare(5); Çalışma anı (genelde)
[0u8; kare(2) as usize] Derleme anı (dizi boyu)
kareler::<5>() [0, 1, 4, 9, 16]

İleri seviye bölümündeki tüm dersler