Box<T>
- Rust kursu
- Orta seviye
- Ders 30/115
- 4 dk
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'teKullanı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
fn main() {
// buraya yaz
}Örnek çözüm
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<[u8; 1000]></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
let b = Box::new(41);
let n = ____b + 1; // 42
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 |