繁体   English   中英

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

[英]Most idiomatic way to double every character in a string in Rust

我有一个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 也有功能元素,我想知道是否有类似简洁的解决方案。

我会使用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);
}

操场

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

就个人而言,我只会做你正在做的事情。 它的意图很明确(在我看来,比您从 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM