Ejemplot: Lista
Implementar fmt::Display para una estructura donde los elementos deben ser cada uno manejados secuencialmente es complicado. El problema es que cada write! genera un fmt::Result. El manejo adecuado de esto requiere tratar con todos losresultados. Rust proporciona el operador ? para exactamente este propósito.
Usar ? con write! se ve así:
// Usa `write!` para ver si falla. Si hay errores, regresa
// el error. En otro caso, continúa.
write!(f, "{}", value)?;
Si disponemos de ?, implementar fmt::Display para un Vec es directo:
use std::fmt; // Importar el módulo `fmt`. // Define una estructura llamada `List` que contiene un `Vec`. struct List(Vec<i32>); impl fmt::Display for List { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // Extrae el valor usando indexación de tuplas, // y crea una referencia a `vec`. let vec = &self.0; write!(f, "[")?; // Iterate over `v` in `vec` while enumerating the iteration // index in `index`. for (index, v) in vec.iter().enumerate() { // Para cada element excepto el primero, agrega una coma. // Usa el operador ? para regresar errroes. if index != 0 { write!(f, ", ")?; } write!(f, "{}", v)?; } // Cierra la llave abierta y regresa un valor de `fmt::Result`. write!(f, "]") } } fn main() { let v = List(vec![1, 2, 3]); println!("{}", v); }
Actividad
Intente cambiar el programa para que el índice de cada elemento en el vector seatambién impreso. La nueva salida debería verse así:
[0: 1, 1: 2, 2: 3]