Co

Collect em Rust

{one: "1 exercício", many: "%{count} de exercícios", other: "%{count} exercícios"}

Sobre Collect

Para entender a função collect, é importante saber que ela é usada para resolver um iterador. Lembre-se de que um iterador é uma sequência de itens que pode ser encadeada com outros iteradores. Os iteradores são preguiçosos, o que significa que eles não são executados até que você chame um código que consuma o iterador. Esse tipo de código inclui laços for e adaptadores consumidores. Os adaptadores consumidores processam todos os itens do iterador para produzir algum tipo de saída.

collect é um desses adaptadores consumidores, que pode ser usado para produzir uma instância de qualquer tipo que implemente o trait FromIterator. Esse trait é implementado para todas as coleções da biblioteca padrão. Como FromIterator é implementado para muitos tipos, você precisa informar ao Rust que tipo de coleção você deseja. Por exemplo, se quisermos um Vec<char> a partir de um slice de string, poderíamos inserir o tipo na nossa chamada a collect assim

    let my_chars = "Hello, World!".chars().collect::<Vec<char>>();
// since the item type of the `String::chars()` iterator can be inferred to be `char`, we can omit that information
// let my_chars = "Hello, World!".chars().collect::<Vec<_>>();

Os dois pontos duplos e os sinais de maior e menor externos (ou seja, ::<_>) são conhecidos como turbofish. Neste caso, o turbofish é uma sintaxe mais ruidosa do que precisamos. Ao especificar o tipo na própria variável, o collect consegue inferir qual coleção deve criar, com menos ruído sintático.

    let my_chars: Vec<char> = "Hello, World!".chars().collect();
// or
// let my_chars: Vec<_> = "Hello, World!".chars().collect();

Se quiséssemos uma String com os caracteres invertidos, poderíamos fazer assim

    let rev_chars: String = "Hello, World!".chars().rev().collect();

A inferência de tipos do Rust é poderosa o suficiente para que, às vezes, não precisemos de uma anotação explícita em linha:

fn get_reversed_chars(phrase: &str) -> Vec<char> {
    phrase.chars().rev().collect()
}

O tipo de retorno da função get_reversed_chars permite que a função collect infira qual coleção retornar. Aqui, porém, precisamos especificar Vec<char> e não Vec<_>, pois o Rust não faz inferência de tipos para assinaturas de funções. Isso garante que quem lê o código saiba rapidamente quais tipos uma função consome e retorna.

Editar via GitHub O link abre em uma nova janela ou aba