Co

Collect em Rust

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

Sobre Collect

Para compreender a função collect, é importante saber que é usada para resolver um iterador. Recorda 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 não são executados enquanto não chamares código que consome o iterador. Esse código inclui ciclos for e adaptadores consumidores. Os adaptadores consumidores processam todos os itens do iterador para produzir algum tipo de resultado.

O 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 o FromIterator está implementado para muitos tipos, tens de dizer ao Rust que tipo de coleção queres. Por exemplo, se quisermos um Vec<char> a partir de uma slice de string, podemos 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 menor e maior exteriores (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 que 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 carateres invertidos, podíamos fazê-lo assim

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

A inferência de tipos do Rust é suficientemente poderosa para que, por 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 à função collect inferir que coleção deve devolver. Aqui, no entanto, temos de especificar Vec<char> e não Vec<_>, porque o Rust não faz inferência de tipos para as assinaturas das funções. Isto serve para garantir que quem lê o código percebe rapidamente que tipos uma função recebe e devolve.

Editar via GitHub A ligação abre numa nova janela ou separador