要循环索引,跟踪下一个/上一个项目,可以按如下方式完成。
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中这样做的最好方法是什么?
答案 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]
。