Box<T>
Box<T> possui T alocado no heap com propriedade única - como Vec mas para um único elemento.
Receita
enum List { Cons(i32, Box<List>), Nil }
use List::{Cons, Nil};
fn main() {
let list = Cons(1, Box::new(Cons(2, Box::new(Nil))));
}Quando usar isso: Tipos recursivos, evitar valores grandes na stack, objetos de trait Box<dyn Trait>.
Exemplo de Trabalho
trait Draw { fn draw(&self); }
struct Circle;
impl Draw for Circle { fn draw(&self) { println!("circle"); } }
fn main() {
let shapes: Vec<Box<dyn Draw>> = vec![Box::new(Circle)];
for s in shapes { s.draw(); }
}O que isso demonstra:
- Enum recursivo com
Boxpara indireção - Objeto de trait no heap via
Box<dyn Draw> - Um único proprietário por box
Mergulho Profundo
Box implementa Deref, Drop libera o heap. Box<[T]> a partir de Vec via into_boxed_slice. Sem sobrecarga de contagem de referência.
Armadilhas
- Box desnecessário em todos os lugares - Prefira struct própria na stack se for pequena. Correção: Perfilar o tamanho da stack.
- Box
comum - Ok para aplicativos; bibliotecas preferem erros tipados. - Mover para fora da box -
*boxouBox::into_inner(1.66+). - Pin<Box<T>> - Para async auto-referencial - avançado.
- Box em no_std -
alloc::boxed::Boxcom alocador.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Vec | Array dinâmico | Indireção de valor único |
Arc | Propriedade compartilhada | Proprietário único |
&T | Empréstimo | Necessidade de transferência de propriedade |
FAQs
Box vs Vec?
Box para um único elemento; Vec para buffer.into_inner?
Extrai T consumindo a box.sintaxe box?
`box 5` historicamente apenas em nightly - use Box::new.Pin box?
Pinning de async/máquina de estados.Box para FFI?
Raro - use alocação bruta em vez disso.zero sized?
Box<ZST> ainda aloca a menos que otimizado.serde?
Box<T> é transparente como T.clone box?
Se T: Clone.default?
Box::default se T: Default.try_new?
Alocação falível em caminhos instáveis/experimentais.Relacionado
- Noções Básicas de Ponteiros Inteligentes
- Objetos de Trait
- Deref & Deref Coercion
- Ponteiros Inteligentes Personalizados
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.