我对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也具有功能性元素,所以我想知道是否存在类似的简洁解决方案。
就我个人而言,我只会做您正在做的事情。它的意图很明确(比您从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();
我将使用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);
}