在 Rust 中,如何在for样式循环中执行可变大小的步骤?我可以使用此构造执行固定大小的步骤:
for i in (0..vals.len()).step_by(4)
{
println!("{}: {}", i, vals[i]);
}
Run Code Online (Sandbox Code Playgroud)
或者更合适的:
for (i,val) in vals.iter().enumerate().step_by(4)
{
println!("{}: {}", i, val);
}
Run Code Online (Sandbox Code Playgroud)
但我真正想做的是:
for i in 0..vals.len()
{
println!("{}: {}", i, vals[i]);
if vals[i] == 1 { i += 2; }
else if vals[i] == 2 { i += 4; }
}
Run Code Online (Sandbox Code Playgroud)
但当然,修改i不会影响循环迭代器。
由于主要具有 C 语言背景,现代语言对迭代器的依赖常常让人感觉像是戴着手套进行编程。通常谷歌会来救援,但我还没有找到任何解决方案来解决这个看似相当简单的问题。
我想出的最好的是
let mut i:usize = 0;
while i < vals.len()
{
println!("{}: {}", i, vals[i]);
if vals[i] == …Run Code Online (Sandbox Code Playgroud) 我正在解析一些文本。我需要支持unicode文本,这就是为什么我要使用String::chars迭代器:
use std::time::Instant;
fn main() {
let text = "a".repeat(10000);
let mut timer1 = 0;
let mut timer2 = 0;
let start1 = Instant::now();
for pos in 1..10000 {
let start2 = Instant::now();
let ch = text.chars().nth(pos).unwrap();
timer2 += start2.elapsed().as_millis();
}
timer1 += start1.elapsed().as_millis();
println!("timer1: {} timer2: {}", timer1, timer2);
}
Run Code Online (Sandbox Code Playgroud)
输出示例:
timer1: 4276 timer2: 133
Run Code Online (Sandbox Code Playgroud)
当我认为它们应该彼此非常接近时,为什么timer2比令人难以置信的要小timer1?
PS我已经知道那.nth很慢,不应该使用。