4

これはRubyの原則に反するかもしれず、少しばかげているように思えるかもしれませんが、Rubyでループの反復中にインデックス変数を変更できるかどうかに興味があります。

Java/C では、次の不自然な例の for ループを使用して、この方法を実行できます。

for (int k = 0; k < 10; k++)
{
   if (k == 5)
      k = 8;
}

同様に、Enumerable#each_with_index を使用してインデックス変数にアクセスできることは承知していますが、このインスタンスで変数にアクセスするのではなく変更する機能に興味があります。

4

3 に答える 3

5

実際の 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         
于 2013-06-07T03:06:30.960 に答える
0

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 が提案したようにループを使用することです。

もちろん、forloop usingnextステートメントを使用してそれを行うこともできますが、それははるかに醜いです:

for k in 0...10
  next if k > 5 && k <= 8
  ... do stuff ...
  next if k == 5
  ... do stuff ...
end
于 2013-06-07T08:37:11.023 に答える
-2

それを行うこともできますが、Ruby プログラマーは一般に for ループを使用しません (使用可能ではありますが)。次のようなこともできます。

[0,1,2,3,4,5,8,9,10].each do |index|
  # your code here
end
于 2013-06-07T03:58:00.800 に答える