Самый идиоматический способ удвоить каждый символ в строке в Rust - PullRequest
2 голосов
/ 18 октября 2019

У меня есть String, и я хочу сделать новый String, с каждым удвоенным символом в первом. Так что "abc" станет "aabbcc" и т. Д.

Лучшее, что я придумал, это:

let mut result = String::new();
for c in original_string.chars() {
    result.push(c);
    result.push(c);
}
result

Это отлично работает. но есть ли более лаконичный (или более идиоматический) способ сделать это?

В JavaScript я, вероятно, написал бы что-то вроде:

original.split('').map(c => c+c).join('')

Или в Ruby:

(original.chars.map { |c| c+c }).join('')

Поскольку в Rust также есть функциональные элементы, мне было интересно, есть ли такое же краткое решение.

Ответы [ 2 ]

6 голосов
/ 18 октября 2019

Я бы использовал std::iter::repeat для повторения каждого char значения с входа. Это создает бесконечный итератор, но для вашего случая нам нужно только итерировать 2 раза , поэтому мы можем использовать take, чтобы ограничить наш итератор, а затем сгладить все итераторы, которые содержатудвоенный char с.

use std::iter;

fn main() {
    let input = "abc"; //"abc".to_string();

    let output = input
        .chars()
        .flat_map(|c| iter::repeat(c).take(2))
        .collect::<String>();

    println!("{:?}", output);
}

Детская площадка

Примечание: Для удвоения мы используем take(2), но вы можете использовать любой usize для увеличения повторения,

2 голосов
/ 18 октября 2019

Лично я бы сделал именно то, что вы делаете. Его цель ясна (на мой взгляд, более понятна, чем функциональные подходы, которые вы представили в JavaScript или Ruby), и она эффективна. Единственное, что я хотел бы изменить, это, возможно, зарезервировать место для персонажей, поскольку вы точно знаете, сколько места вам понадобится.

let mut result = String::with_capacity(original_string.len() * 2);

Однако, если вы действительно любите этот стиль, вы можете использовать flat_map

let result: String = original_string.chars()
    .flat_map(|c| std::iter::repeat(c).take(2))
    .collect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...