【发布时间】:2020-04-07 12:15:44
【问题描述】:
在 Rust 中,如何在 for 样式循环中执行可变大小的步骤?我可以用这个结构做固定大小的步骤:
for i in (0..vals.len()).step_by(4)
{
println!("{}: {}", i, vals[i]);
}
或更恰当的:
for (i,val) in vals.iter().enumerate().step_by(4)
{
println!("{}: {}", i, val);
}
但我真正想做的是:
for i in 0..vals.len()
{
println!("{}: {}", i, vals[i]);
if vals[i] == 1 { i += 2; }
else if vals[i] == 2 { i += 4; }
}
当然,修改i 不会影响循环迭代器。
主要来自 C 背景,在现代语言中对迭代器的依赖通常感觉就像戴着手套进行编程一样。通常谷歌会来救援,但我还没有找到任何解决方案来解决这个看似相当简单的问题。
我想出的最好的是
let mut i:usize = 0;
while i < vals.len()
{
println!("{}: {}", i, vals[i]);
if vals[i] == 1 { i += 2; }
else if vals[i] == 2 { i += 4; }
}
但这感觉就像一个穷人的for 循环,与我应该做的事情相反,以利用配备迭代器的语言。是否有continue 的变体可以跳过迭代,或者有一种方法可以从循环内的迭代器上调用skip?
【问题讨论】:
-
我实际上并不认为这是重复的,因为另一个问题的迭代器是一个“真正的”迭代器——除了调用
next()两次之外,没有办法跳过 2 个项目。这种情况比较窄,卢卡斯的回答是这个问题的好答案,但不适用于另一个。