在Rust中将字符串中的每个字符加倍的最惯用方式

sta*_*ape 2 string rust

我有一个String,我想创建一个新的String字符,第一个字符中的每个字符都加倍。如此"abc"会变得"aabbcc"如此等等。

我想出的最好的是:

let mut result = String::new();
for c in original_string.chars() {
    result.push(c);
    result.push(c);
}
result
Run Code Online (Sandbox Code Playgroud)

这很好。但是有没有更简洁(或更惯用)的方式来做到这一点?

在JavaScript中,我可能会写类似:

original.split('').map(c => c+c).join('')
Run Code Online (Sandbox Code Playgroud)

或在Ruby中:

original.split('').map(c => c+c).join('')
Run Code Online (Sandbox Code Playgroud)

由于Rust也具有功能元素,所以我想知道是否存在类似的简洁解决方案。

Öme*_*den 6

我会用std::iter::repeat重复char输入中的每个值。这将创建一个无限迭代器,但是对于您的情况,我们只需要迭代2次,因此我们可以take用来限制我们的迭代器,然后展平所有包含doubled 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);
}
Run Code Online (Sandbox Code Playgroud)

操场

注意:要加倍使用take(2),我们可以使用任何一个usize来增加重复次数。