Depurando Snippets de Refatoração
Copie e cole padrões de antes/depois para defeitos vistos repetidamente em revisões de código e incidentes de Rust.
Receita
Escolha o cenário que corresponde ao seu erro de compilador ou sintoma de produção; aplique após a variante; execute os testes.
Exemplo de Trabalho
Conflito de Empréstimo E0502
// Antes
let r = &data.items[0];
data.items.push(item);
use_ref(r);
// Depois
let snapshot = data.items[0].clone();
data.items.push(item);
use_val(snapshot);Futuro não Send
// Antes
let cache = Rc<RefCell<Cache>>::new(...);
tokio::spawn(async move { cache.borrow_mut().fill().await });
// Depois
let cache = Arc::new(tokio::sync::Mutex::new(Cache::new()));
let c = cache.clone();
tokio::spawn(async move { c.lock().await.fill().await });Cadeia unwrap no manipulador
// Antes
async fn get(Path(id): Path<u64>) -> Json<User> {
Json(db.fetch(id).await.unwrap())
}
// Depois
async fn get(Path(id): Path<u64>) -> Result<Json<User>, ApiError> {
let user = db.fetch(id).await?.ok_or(ApiError::NotFound)?;
Ok(Json(user))
}Bloqueio em async
// Antes
std::fs::read_to_string(path)?
// Depois
tokio::task::spawn_blocking(move || std::fs::read_to_string(path)).await??Cast com perda
// Antes
let x = user_input as u8;
// Depois
let x = u8::try_from(user_input).map_err(|_| Error::OutOfRange)?;Análise Profunda
Mantenha a biblioteca de snippets da equipe na wiki interna; vincule a essas correções canônicas. Adicione um teste ao aplicar o snippet para evitar regressão.
Armadilhas
- Clonagem cega - impacto no desempenho. Correção: revise a propriedade após a compilação bem-sucedida.
Arcem todo lugar - o risco de deadlock ainda existe com o mutex errado. Correção: mutextokio+ locks curtos.- Snippet sem teste - a regressão retorna. Correção: teste unitário mínimo por correção.
- Edição diferente - a sintaxe do trait
asyncpode diferir; verifique na 1.97. - Copiar de blog desatualizado - verifique com as APIs atuais de
axum/sqlx.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
rustfix/cargo fix | sugestões automatizadas | redesenho semântico |
| Emparelhamento com mentor | lifetimes complexos | snippet rápido ok |
FAQs
Contribuir com snippets?
Envie um PR para o playbook da equipe quando o mesmo erro ocorrer três vezes.
Snippet vs. Artigo?
Artigos explicam o porquê; snippets são de aplicação rápida.
Específico da organização?
Crie um fork da seção interna para os crates da empresa.
Snippets `unsafe`?
Requerem revisão extra; vincule ao template SAFETY.
axum 0.8?
Os snippets assumem os extratores do axum 0.8; verifique o caminho se estiver usando o 0.7.
sqlx offline?
Macros de consulta precisam de dados SQLX_OFFLINE; snippet separado para CI.
polars collect?
Substitua o collect ávido pelo snippet de correção de plano preguiçoso na documentação da equipe de dados.
serde deny unknown?
Adicione o snippet de atributo para DTOs de API externa.
clippy auto?
cargo clippy --fix às vezes substitui um snippet manualmente.
Verificar correção?
cargo test + clippy + teste de integração relevante.
Relacionado
- Cenários de Erro do Borrow Checker
- Cenários de Panic & Unwrap
- Erros de Send/Sync & Thread
- Combatendo o Borrow Checker
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+.