CodeBlanks Logo Icon CodeBlanks

Box<T>

Box<T> ile öbek üzerinde yer ayırmayı öğrenirsin.

Box<T>

Box<T>, değeri heap'e koyan ve tek sahipli en basit akıllı işaretçidir. Kutu kapsamdan çıkınca heap'teki değer de bırakılır. * ile içerik okunur:

let b = Box::new(41);
let n = *b + 1;          // 42
let buyuk = Box::new([0u8; 1000]);   // 1000 bayt heap'te

Kullanım yerleri: boyutu derleme anında bilinmeyen türler (özyinelemeli türler, dyn Trait), büyük değerleri kopyalamadan taşımak.

Box ve trait nesneleri

En sık kullanım, farklı türleri aynı arayüz arkasında tutmaktır. Box<dyn Trait> bir "şişman işaretçi"dir: veri adresi + vtable adresi:

use std::fmt::Display;

let ogeler: Vec<Box<dyn Display>> = vec![Box::new(3), Box::new("üç"), Box::new(3.0)];
for o in &ogeler {
    print!("{o} ");   // 3 üç 3
}

Box metotları çağırırken otomatik çözülür; b.len() içerideki değerin metodunu çağırır.

Uygulama Kutular

Box::new(41) oluştur ve içeriğine 1 ekle. Ayrıca Box::new([0u8; 1000]) oluştur. Toplamı ve dizinin uzunluğunu boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn main() {
    let b = Box::new(41);
    let n = *b + 1;
    let buyuk = Box::new([0u8; 1000]);
    println!("{} {}", n, buyuk.len());
}

Beklenen çıktı

42 1000

Soru ve cevaplar

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

1 <code>Box&lt;[u8; 1000]&gt;</code> değişkeni stack'te ne kadar yer kaplar?

  • 0
  • Bir işaretçi kadar (64 bit sistemde 8 bayt) Doğru cevap
  • 1000 bayt
  • 1008 bayt

Açıklama: Veri heap'tedir; stack'te yalnızca adres durur. Taşımak 8 bayt kopyalamak demektir.

2 İçeriği oku

Soru
let b = Box::new(41);
let n = ____b + 1;   // 42
Cevap
let b = Box::new(41);
let n = *b + 1;   // 42

Açıklama: * kutunun içindeki değeri verir.

3 İfade ve anlamı

Kavram Anlamı
Box::new(5) Heap'te 5
*b İçerik
Box<dyn Display> Trait nesnesi
drop(b) Erken bırakma

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