Macros Declarativas (`macro_rules!`)
Aprenda a escrever macros declarativas para abstrair padrões de código repetitivos e gerar código durante a compilação.
Macros Declarativas (`macro_rules!`) é uma aula grátis de Learn Rust Coding no CoddyKit. Esta é a aula 1 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Learn Rust Coding, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Learn Rust Coding inclui 3 aulas no total.
O que são macros do Rust?
Macros são uma forma de escrever código que escreve código! Elas são semelhantes a funções, mas operam sobre árvores sintáticas (a estrutura do seu código), e não sobre valores.
- Elas ajudam a abstrair código repetitivo.
- Permitem criar linguagens específicas de domínio (DSLs) dentro do Rust.
- São executadas em tempo de compilação, gerando código Rust comum antes da compilação.
Sintaxe de macros declarativas
As macros declarativas do Rust usam a palavra-chave macro_rules!. Elas definem um conjunto de regras que correspondem a padrões específicos de código Rust.
Pense nisso como correspondência de padrões para trechos de código. Quando o compilador encontra uma chamada de macro, ele tenta corresponder a entrada a uma das regras que você definiu.
Seu primeiro `macro_rules!`
Vamos criar uma macro muito simples que exibe uma saudação. Observe a palavra-chave macro_rules! e a sintaxe () => {}, que define uma regra sem padrão de entrada.
Experimente executar este exemplo:
macro_rules! greet {
() => {
println!("Hello from a macro!");
};
}
fn main() {
greet!(); // Call our macro!
}Capturando entradas com especificadores
Macros podem receber entradas usando "especificadores". Eles informam à macro que tipo de sintaxe Rust ela deve esperar capturar.
$expr: uma expressão (por exemplo,1 + 2,"hello")$ident: um identificador (por exemplo, nome de variável ou de função)$ty: um tipo (por exemplo,i32,String)$block: um bloco de código (por exemplo,{ ... })- ...e muitos outros!
Macros que recebem argumentos
Aqui está uma macro que recebe uma expressão ($e:expr) e exibe seu valor. O :expr é o especificador.
O $e capturado fica disponível para uso no corpo da macro. A macro stringify! converte a expressão em sua representação textual.
macro_rules! debug_print {
($e:expr) => {
println!("Debug: {} = {:?}", stringify!($e), $e);
};
}
fn main() {
let x = 10;
debug_print!(x + 5);
debug_print!("Rust macros are fun");
}Tratando várias entradas
E se você quiser que uma macro receba vários argumentos do mesmo tipo? Você pode usar operadores de repetição: $()*.
$(): o conteúdo interno é o padrão a ser repetido.*: zero ou mais repetições.+: uma ou mais repetições.- Você também pode especificar um separador, como
$(...),*para itens separados por vírgulas.
Macro com argumentos repetitivos
Vamos criar uma macro que recebe várias expressões separadas por vírgulas e exibe cada uma individualmente. Isso é útil para criar estruturas semelhantes a listas.
macro_rules! print_all {
( $( $x:expr ),* ) => {
$( // This $(...)* repeats the `println!` call
println!("Item: {:?}", $x);
)*
};
}
fn main() {
print_all!(1, "hello", true, 3.14);
print_all!("Just one item");
}Entendendo a higiene das macros
As macros do Rust são "higiênicas". Isso significa que as variáveis definidas dentro de uma macro não entrarão acidentalmente em conflito com variáveis externas, mesmo que tenham o mesmo nome.
Durante a expansão, o compilador renomeia elementos internamente para evitar efeitos colaterais indesejados, tornando as macros mais seguras e previsíveis.
Como depurar macros
Às vezes, as macros não são expandidas como você espera. O Rust oferece uma forma de visualizar o código expandido:
- Execute
cargo expand(é necessário instalar a ferramentacargo-expand) - Use
rustc --pretty expandeddiretamente no seu arquivo de código-fonte.
Isso mostra o código Rust bruto gerado pela sua macro, o que é extremamente útil para depurar e compreender comportamentos complexos de macros!
Questionário sobre correspondência de padrões em macros
Considere a seguinte definição de macro:
macro_rules! make_tuple {
( $x:expr, $y:expr ) => {
($x, $y)
};
}Qual das linhas a seguir seria compilada e usaria a macro make_tuple! com sucesso?
Recapitulação: macros declarativas
Nesta lição, você aprendeu sobre macros declarativas usando macro_rules!:
- Elas geram código em tempo de compilação, abstraindo padrões repetitivos.
- Usam correspondência de padrões para capturar entradas com base na sintaxe.
- Especificadores como
$expre$identindicam que tipo de sintaxe esperar. - Operadores de repetição como
$()*tratam vários argumentos com separadores flexíveis. - As macros são higiênicas, evitando conflitos acidentais de nomes.
Macros são uma ferramenta poderosa para reduzir código repetitivo e criar APIs flexíveis e ergonômicas em Rust!
Perguntas Frequentes
A aula “Macros Declarativas (`macro_rules!`)” é grátis?
Sim — o texto completo de “Macros Declarativas (`macro_rules!`)” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Learn Rust Coding, atualize para CoddyKit PRO. O curso de Learn Rust Coding inclui 3 aulas no total.
O que vou aprender em “Macros Declarativas (`macro_rules!`)”?
Aprenda a escrever macros declarativas para abstrair padrões de código repetitivos e gerar código durante a compilação. Você pratica Learn Rust Coding com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Learn Rust Coding?
Nenhuma experiência prévia é necessária. Learn Rust Coding no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 3.
Quanto tempo leva a aula “Macros Declarativas (`macro_rules!`)”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Learn Rust Coding?
Sim. Cada aula de Learn Rust Coding inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Macros Declarativas (`macro_rules!`)
- Macros Procedurais: Derive e Função
- Interação com Rust Não Seguro