相关疑难解决方法(0)

使用 for 循环迭代切片时跳过元素

在 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)

iterator for-loop rust

6
推荐指数
1
解决办法
2511
查看次数

为什么计时器显示的如此违反直觉?

我正在解析一些文本。我需要支持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很慢,不应该使用。

performance rust

3
推荐指数
1
解决办法
91
查看次数

标签 统计

rust ×2

for-loop ×1

iterator ×1

performance ×1