Rust 是否支持负数循环?

3

简单问题,能否在一个负数范围上进行for循环?具体地说,从-1开始迭代到一些负值。显然,for i in -1..x 不可行。

除了在循环中应用符号的不良解决方案外,还有什么其他方法吗?


这个回答解决了你的问题吗?[如何制作一个倒叙循环?] (https://dev59.com/Jl8e5IYBdhLWcg3w-OYn) - Herohtar
2个回答

2
问题不在于负数,而是在于反向范围。如果我们假设x < -1,那么你将得到一个(a,b)范围,其中a > b
在Rust for循环中的默认步骤为+1,因此循环永远不会执行。如果你以C ++风格编写它,你将会说:
for (i=-1; i < x; i++) { ... }

所以你想做的是反转范围:

for i in (x..=-1).rev()

编辑:因为(x..-1)不包括-1,所以我们需要将其更改为(x..=-1)。在这种情况下,范围将包括x1。如果我们不想要那样,我们也可以调整x的边界,例如((x+1)..=-1).rev


“step_by”参数不应该是无符号的吗? - Robby Cornelissen
哎呀,是的。看到我的编辑了吗?我发誓它过去曾经能用。显然那是在不稳定的时期:https://internals.rust-lang.org/t/step-by-on-negative-numbers/2231 - cadolphs
请注意,for i in (x..-1).rev() 循环从 -2 递减到 x,因为范围 x..-1 不包括终点。 - Sven Marnach
正如Sven Marnach所指出的那样,(x..-1).rev()从**-2**开始。应该是(x..=-1).rev() - user4815162342

2
标准的 Range 类型(使用 a..b 表示)是一个半开区间,即左闭右开的 递增 区间。如果你有一个满足 a >= b 的区间,则该区间为空。
如果你想按照倒序(递减)迭代区间,则需要使用 Iterator::rev 反转该区间,这需要该区间实现 DoubleEndedIterator 并提供反向迭代方法 next_back
因此,在本例中,您需要迭代 ((x + 1)..0).rev()
作为一个有趣的附注,你也可以通过 iter::successors 获取基本上任何你想要的迭代器,只需提供一个 fn next(&T) -> Option<T> 即可。在某些特定情况下,这可能比反转递增区间更加清晰。

(x..-1).rev() 将从 -2 开始。你需要使用 (x..=-1).rev() - user4815162342

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接