[英]What is the correct & idiomatic way to check if a string starts with a certain character in 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.