我目前的尝试:
pub async fn sanize_string(input : String) -> String {
let output = input
.chars()
.flat_map(|c| if c == '\'' { iter::repeat(c).take(2); } else { iter::once(c).take(1); } )
.collect::<String>();
return output;
}
目标:示例以
O'Brian
作为输入 -> O''Brian
作为输出
忽略拼写错误。那么主要问题是
iter::once()
和iter::repeat()
是两种不同的类型。
在这种情况下,您可以始终使用
iter::repeat()
轻松修复它,即
.flat_map(|c| {
let n = if c == '\'' { 2 } else { 1 };
iter::repeat(c).take(n)
})
对于更复杂的情况,您可以使用
enum
和 impl Iterator
。在这些情况下,您也可以只使用 itertools::Either
就是这样。看起来像这样:
.flat_map(|c| {
if c == '\'' {
Either::Left(iter::repeat(c).take(2))
} else {
Either::Right(iter::once(c).take(1))
}
})