Box ve recursion
- Rust kursu
- Orta seviye
- Ders 33/115
- 4 dk
Box ile özyinelemeli tür tanımlamayı öğrenirsin.
Box ve recursion
Kendini içeren bir tür doğrudan yazılamaz, çünkü boyutu sonsuz olurdu. Box araya bir işaretçi koyarak boyutu sabitler:
enum Liste {
Dugum(i32, Box<Liste>),
Bos,
}
// enum Liste { Dugum(i32, Liste), Bos } // hata E0072: sonsuz boyut
use Liste::{Bos, Dugum};
let l = Dugum(1, Box::new(Dugum(2, Box::new(Dugum(3, Box::new(Bos))))));Derleyici hata mesajında tam olarak bunu önerir: "insert some indirection (e.g., a `Box`, `Rc`, or `&`)".
Özyinelemeli fonksiyonlar
Özyinelemeli türler doğal olarak özyinelemeli fonksiyonlarla işlenir; match her variant'ı ayırır:
fn toplam(l: &Liste) -> i32 {
match l {
Dugum(v, sonraki) => v + toplam(sonraki),
Bos => 0,
}
}sonraki bir &Box<Liste>'tir ve &Liste bekleyen fonksiyona otomatik çözülerek verilir.
Uygulama Bağlı liste
Yukarıdaki Liste enum'ını ve toplam fonksiyonunu yaz; ayrıca düğüm sayısını veren uzunluk fonksiyonunu ekle. 1 → 2 → 3 listesi için ikisini boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
enum Liste {
Dugum(i32, Box<Liste>),
Bos,
}
use Liste::{Bos, Dugum};
fn toplam(l: &Liste) -> i32 {
match l {
Dugum(v, sonraki) => v + toplam(sonraki),
Bos => 0,
}
}
fn uzunluk(l: &Liste) -> usize {
match l {
Dugum(_, sonraki) => 1 + uzunluk(sonraki),
Bos => 0,
}
}
fn main() {
let l = Dugum(1, Box::new(Dugum(2, Box::new(Dugum(3, Box::new(Bos))))));
println!("{} {}", toplam(&l), uzunluk(&l));
}Beklenen çıktı
6 3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Özyinelemeli bir ağaç düğümünün çocukları için en uygun tür hangisi?
- &Düğüm her zaman
- [Düğüm; 2]
- Vec<Düğüm> ya da Option<Box<Düğüm>> Doğru cevap
- Düğüm (doğrudan)
Açıklama: Vec ve Box ikisi de heap'te tutar ve boyutu sabittir; Option, yaprak düğümlerde çocuk olmamasını ifade eder.
2 Dolaylı alan
enum Liste {
Dugum(i32, ____),
Bos,
}
enum Liste {
Dugum(i32, Box<Liste>),
Bos,
}
Açıklama: Box işaretçisi özyinelemeli türün boyutunu sabitler.
3 Tanım ve sonuç
| Kavram | Anlamı |
|---|---|
Dugum(i32, Liste) |
E0072 |
Dugum(i32, Box<Liste>) |
Geçerli |
toplam(1→2→3) |
6 |
uzunluk(1→2→3) |
3 |