一次迭代一个字符串,n个元素

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

我会用的组合PeekableTake:

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.