什么是迭代循环包装索引的最佳方法?

时间:2016-08-12 00:32:37

标签: rust iteration

要循环索引,跟踪下一个/上一个项目,可以按如下方式完成。

for index_prev in 0..n {
    let index_next = (index_prev + 1) % n;

    // some arbitrary code...
    some_function(index_prev, index_next);
}

通过避免模数可以提高效率,而不是:

提供索引包装可以偏移一个。

let mut index_prev = n - 1;
for index_next in 0..n {

    // some arbitrary code...
    some_function(index_prev, index_next);

    index_prev = index_next;
}

虽然这有效,但它有一些缺点:

  • index_prev需要被声明为可变的,当我们真的想要循环不可变索引时。
  • index_prev需要在外部作用域名称空间中声明,而不是仅限于for循环。

虽然这些都不是可怕,但它们使解决方案不太理想。

是否有表演者和在Rust中执行此操作的便捷方法还是需要编写自定义迭代器?

在Rust中这样做的最好方法是什么?

1 个答案:

答案 0 :(得分:3)

fn main() {
    let n = 10;
    for (prev, next) in (0..n).zip(1..n+1) {
        println!("{}, {}", prev, next % n);
    }
}

给你:

0, 1
1, 2
....
9, 0

或者,如果您真的不想使用模数,那么:

for (prev, next) in (0..n).zip((0..n).cycle().skip(1)) {

会起作用,但可能会生成更多代码。

另一种方法是在您自己的迭代实现中包装所需的类型,或者[x] getter,它可以正确处理溢出。也就是说,始终从底层结构中获取[x%n]