0Pricing
Learn Rust Coding · Aula

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 ferramenta cargo-expand)
  • Use rustc --pretty expanded diretamente 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 $expr e $ident indicam 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

  1. Macros Declarativas (`macro_rules!`)
  2. Macros Procedurais: Derive e Função
  3. Interação com Rust Não Seguro
← Voltar para Learn Rust Coding