Introdução
Neste laboratório, estamos implementando fmt::Display para uma estrutura chamada List que contém um Vec em Rust. O desafio é lidar com cada elemento sequencialmente usando a macro write!, pois ela gera um fmt::Result que precisa ser tratado adequadamente. Para resolver isso, podemos usar o operador ? para verificar se write! retorna um erro e retorná-lo, caso retorne, caso contrário, continuar com a execução. Ao implementar fmt::Display para List, podemos iterar sobre os elementos no vetor e imprimi-los entre colchetes, separados por vírgulas. A tarefa é modificar o programa para também imprimir o índice de cada elemento no vetor. A saída esperada após a modificação é [0: 1, 1: 2, 2: 3].
Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar
main.rs, compilar e executá-lo comrustc main.rs && ./main.
Caso de Teste: List
Implementar fmt::Display para uma estrutura onde os elementos devem ser tratados sequencialmente é complicado. O problema é que cada write! gera um fmt::Result. O tratamento adequado disso requer lidar com todos os resultados. Rust fornece o operador ? exatamente para essa finalidade.
Usar ? em write! se parece com isto:
// Tente `write!` para ver se ele gera erros. Se gerar erros, retorne
// o erro. Caso contrário, continue.
write!(f, "{}", value)?;
Com ? disponível, implementar fmt::Display para um Vec é simples:
use std::fmt; // Importa o módulo `fmt`.
// Define uma estrutura chamada `List` contendo um `Vec`.
struct List(Vec<i32>);
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Extrai o valor usando indexação de tupla,
// e cria uma referência para `vec`.
let vec = &self.0;
write!(f, "[")?;
// Itera 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.
// Use o operador ? para retornar em caso de erros.
if count != 0 { write!(f, ", ")?; }
write!(f, "{}", v)?;
}
// Fecha o colchete aberto e retorna um valor fmt::Result.
write!(f, "]")
}
}
fn main() {
let v = List(vec![1, 2, 3]);
println!("{}", v);
}
Atividade
Tente alterar o programa para que o índice de cada elemento no vetor também seja impresso. A nova saída deve ser assim:
[0: 1, 1: 2, 2: 3]
Resumo
Parabéns! Você concluiu o laboratório Caso de Teste: List. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.