Функциональный эквивалент функции, добавляющей два элемента в вектор в цикле - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь функционально написать следующую функцию:

fn word_split(word: &String) -> Vec<String> {
    let mut split: Vec<String> = Vec::new();
    for (i, _) in word.chars().enumerate() {
        res.push(word[i..].to_string());
        res.push(word[..i].to_string());
    }
    splits

Основная трудность, с которой я столкнулся, заключается в том, что в функции происходит две вставки. Я не знаю, как express это в лучшем случае функционально. Я придумал что-то вроде:

fn word_split(word: &String) -> Vec<String> {

    let word_splits1: Vec<String> = word
        .chars()
        .enumerate()
        .into_iter()
        .map(|(i, _)| word[i..].to_string() )
        .collect();

    let word_splits2: Vec<String> = word
        .chars()
        .enumerate()
        .into_iter()
        .map(|(i, _)| { word[..i].to_string() })
        .collect();

    let word_splits: Vec<String> = [word_splits1, word_splits2].concat();
    word_splits
}

, но, очевидно, это намного хуже, чем в начальной версии.

1 Ответ

0 голосов
/ 26 апреля 2020

Я думаю, что ваше решение хорошо, но, возможно, split_at может вам помочь.

Один из способов сделать это:

fn word_split2(word: &str) -> Vec<String> {
    word
        .char_indices()
        .flat_map(|(i, _ch)| {
            let (left, right) = word.split_at(i);
            vec![left, right].into_iter() // array would be better than vec!, but does not support into_iter as of now
        })
        .map(|s| s.to_string())
        .collect()
}

Ваш второй версия может быть записана как:

fn word_split2(word: &str) -> Vec<String> {
    let (splits1, splits2) = word
        .char_indices()
        .map(|(i, _ch)| {
            let (left, right) = word.split_at(i);
            (left.to_string(), right.to_string())
        })
        .unzip::<_, _, Vec<_>, Vec<_>>();
    [splits1, splits2].concat()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...