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

问题描述 投票:0回答:2

我对Rust还是陌生的,并且仍然在学习语言的许多方面,如果这个问题看起来很基础,对不起。

[基本上,我有一个String,我想创建一个新的String,第一个字符中的每个字符都加倍。因此"abc"将变为"aabbcc",依此类推。

我想出的最好的是:

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

哪一项工作正常,但是否有更简洁(或更乡村)的方法?

编辑:

给出一个更好的示例,说明为什么我认为可能会有更好的方法来执行此操作,在Java语言中,我可能会写类似以下内容:

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

或在Ruby中:

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

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

string rust
2个回答
1
投票

就我个人而言,我只会做您正在做的事情。它的意图很明确(比您从Javascript或ruby,imo提供的功能方法更清晰),并且它是有效的。我唯一要更改的可能是为字符保留空间,因为您确切知道将需要多少空间。

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

1
投票

我将使用std::iter::repeat然后将所有包含双字符的迭代器展平。对于倍增,我们使用take(2),但是您可以设置任何usize来增加折叠率。

use std::iter;

fn main() {
    let input = "abc";

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

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

Playground

© www.soinside.com 2019 - 2024. All rights reserved.