Caso de Teste: Lista
Implementar fmt::Display
para uma estrutura onde os elementos devem cada um ser manipulados sequencialmente é complicado. O problema é que cada write!
gera um fmt::Result
. A manipulação apropriada disto exige lidar com todos os resultados. A Rust fornece o operador ?
para exatamente este propósito.
Usar ?
na write!
parece-se com isto:
// Tentar `write!` para ver se erra. Se errar, retorne o erro.
// De outro modo continue.
write!(f, "{}", value)?;
Com ?
disponível, implementar fmt::Display
para uma Vec
é simples:
use std::fmt; // Importar o módulo `fmt`. // Definir uma estrutura nomeada `List` contendo uma `Vec`. struct List(Vec<i32>); impl fmt::Display for List { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // Extrair o valor usando a indexação de tupla, // e criar uma referência para `vec`. let vec = &self.0; write!(f, "[")?; // Iterar sobre `v` em `vec` enquanto enumera a // contagem da iteração em `count`. for (count, v) in vec.iter().enumerate() { // Para cada elemento exceto o primeiro, adicione uma vírgula. // Usar o operador `?` para retornar em erros. if count != 0 { write!(f, ", ")?; } write!(f, "{}", v)?; } // Fechar o parênteses retos e retornar um valor de `fmt::Result` write!(f, "]") } } fn main() { let v = List(vec![1, 2, 3]); println!("{}", v); }
Atividade
Tente mudar o programa para que o índice de cada elemento no vetor seja também imprimido. A nova saída deveriam parecer-se com isto:
[0: 1, 1: 2, 2: 3]