Lección 4

Macros básicas

println!, format!, vec! y assert!, las cuatro macros que verás en casi cualquier programa Rust.

Nivel
Inicial
Duración
18 min
Actualizada

Cuatro macros que ya has visto, ahora explicadas

Ya escribiste println! en casi cada ejemplo de este curso, y cada ejercicio comprobó tu solución con assert_eq!, sin que se explicara qué son ni por qué llevan !. Esta lección cierra esa cuenta pendiente, y de paso cierra el módulo 1 entero: vec! cumple la promesa que hizo «Variables, mutabilidad y tipos» de mostrar una colección que sí puede crecer.

println!, format!, vec! y assert! son macros, no funciones: por eso llevan !. Una macro se expande en tiempo de compilación, así que puede aceptar un número variable de argumentos y comprobar tu cadena de formato antes de que el programa se ejecute siquiera.

Verás cuatro estaciones, una por macro: println!, format!, vec! y la familia assert!.

Estado de la macro

  • LLAMADA · println!macro, no función: nota el !
  • MACRO · Display vs Debug{scores:?} imprime el array
  • RESULTADO · salida impresa3 apples · [1, 2, 3]
01 / 04{} · {:?} · {NOMBRE}

Ejercicio 01 · Informe de puntuaciones

Construye un informe con vec! y format!.

El starter ya declara la firma. Completa el cuerpo con un Vec, un bucle for para sumar, y format! para construir el texto final.

0/1correcta

Completa build_report para que devuelva un String con el formato "scores: [a, b, c], total: suma", usando vec!, un for para sumar, y format!.

01

Implementa

Sustituye `todo!` por `vec![a, b, c]`, un `for` que sume, y `format!` con `{scores:?}` y `{sum}`.

Función 01

Construir el informe

Sin cambios

Agrupa los tres valores en un Vec, súmalos con un for, y formatea el resultado con format!.

pub fn build_report(a: i32, b: i32, c: i32) -> String {
    todo!("build a Vec with vec![a, b, c], sum it with a for loop, and format the result")
}
02

Comprueba

Ejecuta los casos visibles y usa el diagnóstico para corregir el código.

produce el texto exacto para valores positivos y negativos
Compilador

Modifica el código antes de ejecutar las pruebas.

03

Ayuda

Consulta pistas progresivas o compara con la solución.

Ejecuta un intento para desbloquear la solución.

Resumen

  • println!, format!, vec! y assert! son macros, no funciones: por eso llevan !.
  • {} usa Display (lectura humana); {:?} usa Debug (depuración), y es el único que funciona con colecciones.
  • format! construye un String con la misma sintaxis que println!, sin imprimir nada.
  • vec! crea un Vec de tamaño variable; a diferencia de un array, admite .push() y .pop().
  • assert!, assert_eq! y assert_ne! hacen panic! con un mensaje formateado cuando la comprobación falla.
  • assert_eq!/assert_ne! exigen que el tipo implemente Debug, para poder imprimir ambos lados si fallan.

Fuentes