CodeBlanks Logo Icon CodeBlanks

Box ve recursion

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

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

Örnek çözüm

main.rs
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

Soru
enum Liste {
    Dugum(i32, ____),
    Bos,
}
Cevap
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

Orta seviye bölümündeki tüm dersler