Melhores Práticas de Macros
Prefira funções, genéricos e traits; use macros quando a sintaxe ou a geração de código exigir. Boas macros têm ótimos erros, testes e gramática de entrada documentada.
Busque em todas as páginas da documentação
Prefira funções, genéricos e traits; use macros quando a sintaxe ou a geração de código exigir. Boas macros têm ótimos erros, testes e gramática de entrada documentada.
macro_rules! ou crate de proc-macro.fn, const fn, trait, impl primeiro. Melhores erros e suporte de IDE.macro_rules! apenas para sintaxe repetitiva. Não para lógica de negócios.proc-macro = true. Mantenha syn fora do grafo de dependência de tempo de execução.syn::Error::new_spanned para diagnósticos. Aponte para o token do usuário, não para os internos da macro.split_for_impl. Derives devem funcionar em struct Foo<T>.#[allow] ou pub.$crate:: em macro_rules! exportadas. Resolve corretamente a partir da crate consumidora.cargo expand para macros não triviais. Verificados em CI via macrotest ou revisão manual.trybuild para entrada inválida. Bloqueie mensagens de erro.proc_macro2. Sem o driver completo do compilador.eprintln! de depuração por feature ou env. Sem compilações barulhentas para usuários.build.rs se necessário.fn testadas.syn/quote conscientemente. O alinhamento do workspace reduz a duplicação de syn.unsafe no código gerado como unsafe escrito à mão. Macro não absolve a revisão.Literais semelhantes a Vec, pequenos helpers de assert, braços de match repetitivos - não ORMs inteiros.
Geralmente crate de macro publicável separada, mesmo que membro interno de monorepo.
Conforme necessário; mantenha derives relacionados juntos; divida se o tempo de compilação prejudicar os consumidores.
Prefira expansão segura; se unsafe for necessário, documente os invariantes na documentação emitida.
Sim para frameworks; ainda ofereça um caminho de construtor não-macro quando viável para usuários de IDE.
Resolução de caminhos e prelúdios use; teste a expansão sob uma crate consumidora de 2024.
Workshop: expanda o derive do serde, escreva um derive minúsculo, depure com trybuild.
Planeje um escape hatch: padrão de código gerado estável o suficiente para ser escrito à mão se a macro for removida.
Lints do Clippy se aplicam à expansão; corrija o gerador, não use allow em todos os lugares.
Mostre exemplos de expansão na documentação; doc_cfg para caminhos de macro com feature gate.
Versões de 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+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026