2012-03-29 10 views
8

は、私はルビーに変換する方法Rubyのループでいくつかの繰り返しをスキップする方法は?

for(i = 0; i < 10; i++){ 
    printf("Hello"); 
    if(i == 5){ 
     a[3] = a[2] * 2; 
     if(a[3] == b) 
      i = a[3];   //Skip to index = a[3]; depends on runtime value 
    } 
} 

以下のCコードがあると? nextを使用して1回の繰り返しをスキップできることはわかっていますが、条件付きの値に応じていくつかの繰り返しをスキップしなければならず、実行前にスキップする回数はわかりません。ここで


は(Coreywardで述べたように)私は実際に働いているコードです:

私は値が0.1未満(0.1未満の意志を異なるという配列に「直線」を探しています「直線」とみなす)。範囲は、長い「線」とみなすために50より長くなければなりません。私はライン範囲[a、b]を見つけた後、反復を上限bにスキップして+ 1から再開しないで、b + 1から新しい "直線"を見つけるようにします。

for(i=0; i<arr.Length; i++){ 
    if(arr[i] - arr[i + 50] < 0.1){ 
    m = i;         //m is the starting point 
    for(j=i; j<arr.Length; j++){    //this loop makes sure all values differs less than 0.1 
     if(arr[i] - arr[j] < 0.1){ 
     n = j; 
     }else{ 
     break; 
     } 
    } 
    if(n - m > 50){       //Found a line with range greater than 50, and store the starting point to line array 
     line[i] = m 
    } 
    i = n          //Start new search from n 
    } 

}

+2

を与えるあなたが達成しようとしているものの意図を提供する場合、それははるかに参考になります。 Enumeratorクラスには、次の反復( 'feed')の値を設定し、次の値(' peek')を見るための便利なメソッドがいくつかあります。また、forループを使用することもできますルビー。私はこれを書くためのクリーナーな方法があると確信しています、私はそれが何をしようとしているのか分かりません。 – coreyward

+0

あなたはC言語で配列の終わりをインデックスするつもりですが、おそらく 'arr.Length-50'にバインドを変更したいと思っています。これは、値が初期値のイプシロンである50以上のランを見つけるためにやや複雑な方法のようです。 – dbenhur

+0

大きなインデックスの値は、より低いインデックスの値より小さくなることはないと思われます。これは本当ですか? – dbenhur

答えて

2

もう一つの方法は、enumeratorクラスを使用している:

iter = (1..10).to_enum 
while true 
    value = iter.next 
    puts "value is #{value.inspect}" 
    if value == 5 
    3.times {value = iter.next} 
    end 
end 

value is 1 
value is 2 
value is 3 
value is 4 
value is 5 
value is 9 
value is 10 
StopIteration: iteration reached at end 
     from (irb):15:in `next' 
     from (irb):15 
     from C:/Ruby19/bin/irb:12:in `<main>' 
+0

これはかわいいですが、インデックスを直接進めることと同等ではありません。 iと配列を反復して、インデックスjに進むことを望む決定に達すると、 '(j-i)×{iter.next} 'を実行することは、単にi = jを割り当てることよりも複雑で高価になる – dbenhur

3

あなたのケースを容易に典型的なルビーイテレータによって覆われていないが、ルビーも通常有する完全に覆うことができるwhileループC-ため。以下は上記のc forループと同じです。

i = 0; 
while i < 10 
    puts "Hello" 
    if i == 5 
    a[3] = a[2] * 2 
    i = a[3] if a[3] == b 
    end 
    # in your code above, the for increment i++ will execute after assigning new i, 
    # though the comment "Skip to index = a[3]" indicates that may not be your intent 
    i += 1 
end 
+0

はい、これは動作しますが、列挙子で行う方法はありますか?私は 'drop'について考えていたので、5とa [3]の間の値を落としますが、コーディングを開始すると混乱し、失われました。 – texasbruce