我意识到这可能违反了 ruby 原则并且可能看起来有点傻,但是我很好奇是否可以在 ruby 中的循环迭代期间修改索引变量。
在这个人为的例子中,这种做法在 Java/C 中可以使用 for 循环:
for (int k = 0; k < 10; k++)
{
if (k == 5)
k = 8;
}
同样,我知道可以使用 Enumerable#each_with_index 访问索引变量,但我对在此实例中更改变量而不是访问它的能力感兴趣。
实际上 for 语义如下:
for(executed_once_before_all; test; execute_every_loop) { /* code */ }
所以,在红宝石中:
executed_once_before_all
while test do
execute_every_loop
# code
end
所以你的例子是这样的:
k = 0
while k < 10 do
k = 8 if (k == 5)
k += 1
end
在 Ruby 中更改for
循环计数器不会更改迭代次数。
您可以更改计数器变量,但这只会影响当前迭代:
> for k in 0...10
> k = 8 if k == 5
> puts k
> end
0
1
2
3
4
8 # Note this!
6
7
8
9
实现所需行为的最佳方法是while
按照@fotanus 的建议使用循环。
当然,您可以使用for
循环next
语句来做到这一点,但这更难看:
for k in 0...10
next if k > 5 && k <= 8
... do stuff ...
next if k == 5
... do stuff ...
end
您可以这样做,但 Ruby 程序员通常不使用 for 循环(尽管它可用)。你也可以这样做:
[0,1,2,3,4,5,8,9,10].each do |index|
# your code here
end