Демистификация Rust: создание HashMap из данных с разделителями в строке

Rust — мощный язык системного программирования, известный своими функциями безопасности, скорости и параллелизма. В этой статье блога мы рассмотрим различные методы создания HashMap из данных с разделителями внутри строки. Мы предоставим примеры кода и объясним каждый метод в разговорной форме, чтобы новичкам было легче его понять. Итак, приступим!

Метод 1: традиционный подход
Первый метод предполагает использование функции split()для разделения строки на пары ключ-значение и последующего заполнения HashMap соответствующим образом. Вот пример:

use std::collections::HashMap;
fn create_hashmap_from_delimited_string(input: &str, delimiter: char) -> HashMap<&str, &str> {
    let mut hashmap: HashMap<&str, &str> = HashMap::new();

    for pair in input.split(delimiter) {
        let mut iter = pair.splitn(2, '=');
        if let Some(key) = iter.next() {
            if let Some(value) = iter.next() {
                hashmap.insert(key, value);
            }
        }
    }

    hashmap
}

Метод 2: использование регулярных выражений
Если вы предпочитаете более гибкий подход, вы можете использовать регулярные выражения для извлечения пар ключ-значение из строки. Крейт regexобеспечивает отличную поддержку регулярных выражений в Rust. Вот пример:

use std::collections::HashMap;
use regex::Regex;
fn create_hashmap_with_regex(input: &str, pattern: &str) -> HashMap<&str, &str> {
    let mut hashmap: HashMap<&str, &str> = HashMap::new();
    let regex = Regex::new(pattern).unwrap();
    for capture in regex.captures_iter(input) {
        if let (Some(key), Some(value)) = (capture.get(1), capture.get(2)) {
            hashmap.insert(key.as_str(), value.as_str());
        }
    }
    hashmap
}

Метод 3: использование контейнера serde
Для более сложных сценариев, когда данные с разделителями соответствуют определенному формату (например, JSON или CSV), вы можете использовать serdeвместе с соответствующими функциями десериализации. Этот подход позволяет анализировать строку непосредственно в HashMap. Вот пример использования JSON:

use std::collections::HashMap;
use serde_json;
fn create_hashmap_from_json(input: &str) -> HashMap<String, String> {
    serde_json::from_str(input).unwrap()
}