Noções Básicas de Propriedade
10 exemplos para você começar com propriedade - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com propriedade - 7 básicos e 3 intermediários.
fn main() {
let s = String::from("owner");
consume(s);
// println!("{s}"); // erro: movido
}
fn consume(s: String) {
println!("{s}");
}String possui bytes no heaps para consume move a propriedadeconsume descarta (drops) s no final do escopoRelacionado: Semântica de Move e Cópia - tipos
Copy
Dropfn main() {
{
let s = String::from("temp");
println!("{s}");
} // drop é executado aqui
println!("done");
}Drop::drop libera recursos (heap para String)Relacionado: Noções Básicas de Ponteiros Inteligentes -
Droppersonalizado
fn main() {
let a = vec![1, 2, 3];
let b = a;
println!("{:?}", b);
}Vec não é Copyfn make_greeting() -> String {
String::from("hello")
}
fn main() {
let g = make_greeting();
println!("{g}");
}String quando o chamador deve possuir os dadosstruct Pair { a: String, b: String }
fn main() {
let p = Pair { a: "x".into(), b: "y".into() };
let a = p.a; // move parcial
// println!("{}", p.b); // OK
println!("{a}");
}Copyborrowing) campos quando possívelfn len(s: &String) -> usize { s.len() }
fn main() {
let s = String::from("rust");
println!("{}", len(&s));
println!("ainda possuo: {s}");
}&String empresta sem tirar a propriedadeBorrowing) para &mutRelacionado: Empréstimo e Referências
Vecfn main() {
let mut v = Vec::new();
v.push(1);
v.push(2);
let last = v.pop().unwrap();
println!("{last}, len={}", v.len());
}Vec possui um buffer no heappush pode realocar e mover elementospop remove a propriedade do último elemento para o chamadorVecDrop Personalizado com Efeitos Colateraisstruct LogOnDrop(&'static str);
impl Drop for LogOnDrop {
fn drop(&mut self) {
println!("dropping {}", self.0);
}
}
fn main() {
let _x = LogOnDrop("resource");
}Drop para limpeza além da memóriadrop é chamado automaticamente, não recursivamente pelo valorstd::mem::drop(x) executa o drop antecipadamente explicitamenteDrop::drop manualmente em valoresRc para Propriedade Compartilhada (Preview)use std::rc::Rc;
fn main() {
let a = Rc::new(String::from("shared"));
let b = Rc::clone(&a);
println!("refs={}", Rc::strong_count(&a));
drop(b);
println!("{a}");
}Rc conta os proprietários em código single-threadedRc::clone incrementa a contagem, não faz clone profundo da stringArc é a variante thread-safeRelacionado: Rc & Arc
fn main() {
let mut map = std::collections::HashMap::new();
map.insert("key".to_string(), vec![1, 2]);
if let Some(v) = map.remove("key") {
println!("{:?}", v);
}
}HashMap possui chaves e valoresinsert move o valor para dentroremove move o valor para fora (deixa a chave ausente)get para consulta somente leituraRelacionado: Melhores Práticas de Propriedade
Versões da Pilha: 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+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026