gpt4 book ai didi

for-loop - 使用 for 循环遍历切片时跳过元素

转载 作者:行者123 更新时间:2023-12-03 11:26:01 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to skip n items from inside of an iterator loop?

(2 个回答)


1年前关闭。




在 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 的方法在循环内的迭代器上?

最佳答案

真的没有更好的选择了。我仍然可以想到这一点:

let mut skip = 0;
for (i, val) in vals.iter().enumerate() {
if skip > 0 {
skip -= 1;
continue;
}

println!("{}: {}", i, val);

skip = match val {
1 => 2,
2 => 4,
_ => 0,
};
}

但这并不一定比您已有的想法更好。

没有“好的”解决方案的原因仅仅是因为这种用例非常罕见。 for循环用于完全迭代迭代器的常见情况。对于需要更复杂的“高级迭代器”逻辑的情况, whileloop循环就在你身边。这些循环并不是“坏”的,它们完全适用于这些情况。

我想你的 while循环解决方案非常好!

关于for-loop - 使用 for 循环遍历切片时跳过元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59332811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com