Cenários de Erro do Verificador de Empréstimos
Aprenda a ler erros do verificador de empréstimos: eles citam empréstimos conflitantes e sugerem correções. A maioria se resolve encurtando o escopo do empréstimo, clonando nas fronteiras ou reestruturando a propriedade.
Receita
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
Padrão de correção: termine o empréstimo imutável antes do empréstimo mutável (reduza o escopo, clone ou reestruture).
Exemplo de Trabalho
Problema: mantendo uma referência enquanto se muta um contêiner.
// Antes (erro)
let r = &vec[0];
vec.push(1); // invalida r
println!("{r}");
// Depois
let first = vec[0];
vec.push(1);
println!("{first}");Empréstimos divididos:
let (left, right) = slice.split_at_mut(mid);
// use left and right separatelyO que isso demonstra:
- Realocação invalida referências (
Vec::push) split_at_mutpara duas regiões mutáveis- Clone a chave na fronteira de spawn para tarefas assíncronas
Análise Profunda
Erros comuns: E0502 (conflito de empréstimo), E0499 (dois empréstimos mutáveis), E0597 (não vive o tempo suficiente). rust-analyzer frequentemente mostra um gráfico de empréstimos.
Armadilhas
- Lutando com escopos aninhados - aumente a função. Correção: extraia uma função que recebe
&T. - Empréstimo em tempo de execução do RefCell - entra em pânico em vez de erros de compilação. Correção: encurte o escopo de
borrow_mut. - Iterador detém empréstimo - colete ou o bloco de escopo termine antes de mutar o vec.
- Campos de struct sobrepostos - empreste a struct inteira. Correção: divida os campos em sub-structs.
- Auto-empréstimo assíncrono -
&mut selfatravés deawait. Correção: dados de propriedade na tarefa.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Arc<Mutex<T>> | mutação compartilhada | caminho quente de thread única |
| Índice em vez de referência | cópia de vec[i] | item grande não-Copy |
| Índices de Arena | alias de grafo | árvore simples |
FAQs
Ler erro completo?
A segunda nota mostra onde o outro empréstimo começou.
muitos clones?
Reestruture após corrigir a correção primeiro.
polonius?
O futuro verificador de empréstimos pode aceitar mais; ainda escreva propriedade clara.
aprender sem dor?
Pequenos exercícios; compilador como professor.
ajuda do IDE?
Dicas de inlay do rust-analyzer e sugestões de correção.
comum em axum?
Clone o estado Arc; não segure & através de await do próprio handler.
hashmap get_mut + insert?
Divida os escopos; não pode obter enquanto insere o mesmo mapa.
captura de closure?
Mova o closure ou clone antes de mover.
referência em struct?
Parâmetros de tempo de vida são necessários; veja cenários de tempo de vida.
quando unsafe?
Último recurso; documente invariantes.
Relacionados
- Cenários de Incompatibilidade de Tempo de Vida
- Cenários de Mover Após o Uso
- Lutando com o Verificador de Empréstimos
- Ferramentas de Depuração
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+.