Rust: XX cannot be formatted with the default formatter

Si tienes algo de experiencia en Rust seguramente habrás visto que cuando quieres mostrar algún tipo de dato no «primitivo» te sale un mensaje de este tipo:

XX cannot be formatted with the default formatter

Y posiblemente habrás visto que vale con añadir:

#[derive(Debug)]

Pero hay otra solución más chula (y engorrosa) que vamos a ver aquí.

Imagina la estructura «Fraccion»:

struct Fraccion {
	numerador: u32,
	denominador: u32,
}

Si quieres mostrarla tendrás un error:

fn main() {
    let a = Fraccion{ numerador: 1, denominador: 2};
    println!("{}", b);
}

Lo dicho, puedes ir a lo cómo y añadir el #[derive(Debug)]:

#[derive(Debug)]
struct Fraccion {
	numerador: u32,
	denominador: u32,
}

y te lo mostrará así:

Fraccion { numerador: 1, denominador: 2 }

Pero también puedes definir cómo quieres que se muestre implementando el trait «std::Display» así:

impl fmt::Display for Fraccion {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}/{}", self.numerador, self.denominador)
    }
}

No te líes mucho, basta con saber que solo tienes que cambiar dos líneas:

impl fmt::Display for Fraccion {

Aquí en lugar de «Fraccion» tendrás que poner la estructura para la que quieres definir cómo se va a mostrar.

Y luego tienes que cambiar:

write!(f, "{}/{}", self.numerador, self.denominador)

Aquí es donde sucede la «magia». La macro write!() es similar a la macro println!() y es donde defines el formato.

En mi ejemplo nos mostrará la fracción con este aspecto:

1/2

Mucho más bonito ¿no?

¿Quieres apuntarte al «Reto diario de Rust»?

Es una forma cómoda y divertida de aprender Rust. Cada día recibes en tu email un pequeño concepto de Rust y luego tendrás que contestar a una pregunta.

De esta forma, poco a poco, pero sin descanso, irás adentrándote de manera divertida y sencilla en el apasionante mucho de Rust.

Para apuntarte solo necesitas entrar en este enlace y apuntarte:

https://urlantools.urlanheat.com/newsletter/coding-crabs-es/subscribe?o=blogcrabs

Deja un comentario