Lección 4
Macros básicas
println!, format!, vec! y assert!, las cuatro macros que verás en casi cualquier programa Rust.
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!.
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.
Objetivo
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!.
Implementa
Sustituye `todo!` por `vec![a, b, c]`, un `for` que sume, y `format!` con `{scores:?}` y `{sum}`.
Función 01
Construir el informe
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")
}Comprueba
Ejecuta los casos visibles y usa el diagnóstico para corregir el código.
Pruebas visibles
Modifica el código antes de ejecutar las pruebas.
Ayuda
Consulta pistas progresivas o compara con la solución.
/// Builds a report string from three scores using vec! and format!.
#[must_use]
pub fn build_report(a: i32, b: i32, c: i32) -> String {
let scores = vec![a, b, c];
let mut sum = 0;
for score in &scores {
sum += score;
}
format!("scores: {scores:?}, total: {sum}")
}
// Playground entry point for this example.
fn main() {
println!("{}", build_report(10, 20, 30));
}Resumen
println!,format!,vec!yassert!son macros, no funciones: por eso llevan!.{}usaDisplay(lectura humana);{:?}usaDebug(depuración), y es el único que funciona con colecciones.format!construye unStringcon la misma sintaxis queprintln!, sin imprimir nada.vec!crea unVecde tamaño variable; a diferencia de un array, admite.push()y.pop().assert!,assert_eq!yassert_ne!hacenpanic!con un mensaje formateado cuando la comprobación falla.assert_eq!/assert_ne!exigen que el tipo implementeDebug, para poder imprimir ambos lados si fallan.