Empréstimos & Referências
Empréstimos permitem que o código use dados sem assumir a propriedade. Referências compartilhadas (&T) permitem leitores concorrentes. Referências mutáveis (&mut T) concedem acesso exclusivo de escrita.
Busque em todas as páginas da documentação
Empréstimos permitem que o código use dados sem assumir a propriedade. Referências compartilhadas (&T) permitem leitores concorrentes. Referências mutáveis (&mut T) concedem acesso exclusivo de escrita.
fn push_char(s: &mut String, c: char) {
s.push(c);
}
fn display(s: &str) {
println!("{s}");
}
fn main() {
let mut msg = String::from("hi");
display(&msg);
push_char(&mut msg, '!');
display(&msg);
}Quando usar isso: APIs principalmente de leitura com &T, construtores e mutação com &mut T, evitando transferência de propriedade.
fn split_at_mut<T>(slice: &mut [T], mid: usize) -> (&mut [T], &mut [T]) {
slice.split_at_mut(mid)
}
fn main() {
let mut data = vec![1, 2, 3, 4];
let (left, right) = split_at_mut(&mut data, 2);
left[0] = 10;
right[0] = 40;
println!("{:?}", data);
}O que isso demonstra:
&mut exclusivo para mutaçãosplit_at_mut cria com segurança duas fatias &mut não sobrepostasleft/right saem do escopo&str/&[T] seguem as mesmas regras&T ou exatamente um &mut Tlet mut s = String::from("a");
let r1 = &mut s;
let r2 = &*r1; // Reempresta compartilhado enquanto o empréstimo mutável está ativo em um subconjunto
println!("{r2}");&&String -> &str, &Vec<T> -> &[T] via Deref.
&mut para a mesma variável - Erro de compilação. Correção: Dividir escopos, split_at_mut, ou mutabilidade interior.&mut está ativo - Proibido. Correção: Terminar o empréstimo mutável antes da leitura compartilhada.& para dados locais - Referência pendente. Correção: Retornar valor de propriedade ou vincular o tempo de vida à entrada.&mut - Estende o empréstimo. Correção: Limitar o escopo do empréstimo com blocos.&mut enquanto adiciona elementos - Invalidação do iterador. Correção: Coletar índices primeiro ou usar drain.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Parâmetro de propriedade | O chamador transfere o valor | Apenas leitura ou mutação curta |
RefCell/Mutex | Mutação compartilhada necessária | &mut exclusivo funciona |
| Índice + acesso bruto | Caminhos de alta performance inseguros | Abstrações seguras são suficientes |
| Canais | Passagem entre threads | Empréstimo na mesma thread funciona |
Sim, com empréstimos de campos não sobrepostos: fn f(a: &mut S, b: &mut T) em campos diferentes via empréstimos divididos.
Uma referência que aponta para dados liberados ou movidos. Prevenido por tempos de vida e pelo verificador de empréstimos.
Sim. &mut é acesso exclusivo de leitura/escrita.
Sim, com parâmetros de tempo de vida: struct Holder<'a> { r: &'a str }.
Empréstimo válido para todo o programa - literais de string, alocações vazadas, dados estáticos.
No final do escopo ou último uso (tempos de vida não lexicais).
Sim. Closures capturam por referência (&T, &mut T) ou por movimento.
Não. Referências são seguras, comprovadamente válidas. Ponteiros brutos precisam de unsafe para desreferenciar.
Vinculações em match podem ser referências: match &mut v { ... }.
&mut mantido através de .await é frequentemente rejeitado. Use estado de propriedade ou Mutex em async.
'a existeVersõ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: 16 de jul. de 2026