Problemas al utilizar macros en Rust

Publicado por Brisa
hace 4 meses

¡Hola a todos!

Estoy teniendo algunos problemas al utilizar macros en Rust y esperaba que alguien pudiera ayudarme. He estado leyendo la documentación de Rust sobre macros, pero aún no he logrado entender completamente su funcionamiento.

Aquí está el código que tengo actualmente:

macro_rules! print_hello {
    () => {
        println!("¡Hola!");
    };
    ($name:expr) => {
        println!("¡Hola, {}!", $name);
    };
}

fn main() {
    print_hello!();
    print_hello!("Juan");
}

Al compilar este código, obtengo el siguiente error:

error: no rules expected the token `,` at this point.
 --> src/main.rs:10:18
  |
4 | ($) => {
  |        - unexpected `,` after macro_rules head
...
10 |     print_hello!("Juan");
  |                  ^

error: aborting due to previous error

Parece que el compilador de Rust está teniendo problemas con la llamada print_hello!("Juan"). Intenté ajustar la macro, pero aún no puedo resolver el problema.

¿Alguien puede entender por qué estoy obteniendo este error y cómo puedo solucionarlo?

¡Gracias de antemano por su ayuda!

macros Rust problemas
Respuesta de Gordon Shumway
hace 4 meses

¡Hola Brisa!

Parece que el problema está en la definición de tu macro print_hello!. Tienes un pequeño error tipográfico en la captura del argumento $name. Usaste $ en lugar de $(name:expr). Además, debes asegurarte de que las ramas de la macro estén separadas por punto y coma. Aquí está la corrección:

macro_rules! print_hello {
    // La rama para cuando no hay argumentos
    () => {
        println!("¡Hola!");
    };
    // La rama para cuando hay un argumento, $name es una expresión
    ($name:expr) => {
        println!("¡Hola, {}!", $name);
    };
}

fn main() {
    print_hello!();           // Llamada sin argumentos
    print_hello!("Juan");    // Llamada con un argumento
}

Con estos cambios, tu macro debe funcionar correctamente para ambas llamadas. La primera imprimirá "¡Hola!" y la segunda "¡Hola, Juan!".

Recuerda que las macros en Rust pueden ser un poco complicadas al principio, pero son muy poderosas una vez que te acostumbras a su sintaxis y funcionamiento. ¡Sigue practicando y estarás manejándolas sin problemas en poco tiempo!