Co

Collect у Rust

{one: "1 вправа", few: "%{count} вправи", many: "%{count} вправ", other: "%{count} вправи"}

Про концепцію Collect

Щоб зрозуміти функцію collect, важливо знати, що її використовують, аби отримати результат з ітератора. Пригадаймо, що ітератор - це послідовність елементів, яку можна поєднувати з іншими ітераторами. Ітератори ліниві: вони не виконуються, доки ми не викличемо код, який споживає ітератор. До такого коду належать цикли for та адаптори-споживачі. Адаптори-споживачі обробляють усі елементи ітератора, щоб отримати певний результат.

collect - один із таких адапторів-споживачів; його можна використати, щоб отримати примірник будь-якого типу, який реалізує трейт FromIterator. Цей трейт реалізовано для всіх колекцій зі стандартної бібліотеки. Оскільки FromIterator реалізовано для багатьох типів, потрібно дати Rust знати, яку саме колекцію ми хочемо отримати. Наприклад, якщо ми хочемо отримати Vec<char> зі зрізу рядка тексту (англ. string), можна вставити тип у виклик collect ось так

    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<_>>();

Подвійні двокрапки та зовнішні кутові дужки (тобто ::<_>) називають turbofish. У цьому випадку синтаксис із turbofish громіздкіший, ніж нам потрібно. Якщо вказати тип у самому звʼязуванні, collect може з меншим синтаксичним шумом вивести, яку колекцію створити.

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

Якщо нам потрібен String із символами у зворотному порядку, можна зробити це ось так

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

Виведення типів у Rust достатньо потужне, що іноді нам не потрібне явне зазначення типу в коді:

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

Тип повернення функції get_reversed_chars дає змогу функції collect вивести, яку колекцію слід повернути. Щоправда, тут потрібно вказати саме Vec<char>, а не Vec<_>, бо Rust не виконує виведення типів для сигнатур функцій. Це потрібно, щоб той, хто читає код, міг швидко зрозуміти, які типи функція приймає і повертає.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці