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]