const fn
- Rust kursu
- İleri seviye
- Ders 67/81
- 4 dk
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 olurDerleme 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
fn main() {
// buraya yaz
}Örnek çözüm
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
____ fn kare(x: u32) -> u32 {
x * x
}
const BOYUT: u32 = kare(4);
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] |