and*_*man 5 string iterator rust
我正在尝试遍历一个字符串,但迭代在n每个字符的长度切片而不是迭代器.以下代码手动完成此操作,但有更实用的方法吗?
fn main() {
let string = "AAABBBCCC";
let offset = 3;
for (i, _) in string.chars().enumerate() {
if i % offset == 0 {
println!("{}", &string[i..(i+offset)]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
She*_*ter 10
我会用的组合Peekable和Take:
fn main() {
let string = "AAABBBCCC";
let mut z = string.chars().peekable();
while z.peek().is_some() {
let chunk: String = z.by_ref().take(3).collect();
println!("{}", chunk);
}
}
Run Code Online (Sandbox Code Playgroud)
在其他情况下,Itertools::chunks可能会这样做:
extern crate itertools;
use itertools::Itertools;
fn main() {
let string = "AAABBBCCC";
for chunk in &string.chars().chunks(3) {
for c in chunk {
print!("{}", c);
}
println!();
}
}
Run Code Online (Sandbox Code Playgroud)
每当开始拆分字符串时,请注意字节/字符/代码点/字形的问题.使用比ASCII字符更复杂的东西,一个字符不是一个字节,字符串切片操作字节!还有Unicode代码点的概念,但是多个Unicode字符可以组合形成人类认为的单个字符.这个东西是非平凡的.
如果你实际上只有ASCII数据,那么将它存储起来可能是值得的,也许是在Vec<u8>.至少,我创建了一个newtype,它包装a &str并且只显示ASCII安全方法并在创建时验证它是ASCII.
| 归档时间: |
|
| 查看次数: |
1810 次 |
| 最近记录: |