Implementando fmt::Display para List em Rust

Beginner

This tutorial is from open-source community. Access the source code

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 com rustc 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.