2016-07-01 5 views
1

if文を20回ループしたいが、実行するたびに変更する必要がある。次のものが変更されているIF文秒でRuby - Loop IF x回と条件を変更する

input = [0,0,0,44,754,22,0,632,2,22,0,2,nil,2,24,nil,666,90909,2,4,6,7,2,7,3,2,2,7,1,8,6,3,2,19,5,46] 

Statement = "Statement THIS" 

if 
input[1] != nil && 
    input[2] == 0 
    Statement.sub! "THIS", "WHERE #{input[8]} #{input[9]} THIS" 
else 
end 

puts Statement #Statement WHERE 2 22 THIS 

if 
input[5] != nil && 
    input[6] == 0 
    Statement.sub! "THIS", "AND #{input[12]} #{input[13]} THIS" 
else 
end 

puts Statement #Statement WHERE 2 22 AND 2 THIS 

if 
input[9] != nil && 
    input[10] == 0 
    Statement.sub! "THIS", "AND #{input[16]} #{input[17]} THIS" 
else 
end 

puts Statement #Statement WHERE 2 22 AND 2 AND 666 90909 THIS 

  1. を各キーは1,2,8,9が5,6,12になった(4によって増加しています、13)に変更されました
  2. Wordや

私は、別の18回繰り返すために、この振る舞いをしたいと思いますので、文が持っている場合は、第三:

  1. を各キーが
  2. (5,6,12,13は9,10,16,17になった)4によって増加した単語のHELLOが(ただし、このルールは今GOODBYEに変更されました2番目のIFステートメントがそれを処理したので、冗長です)。
+0

ので、問題は何ですか?あなたは 'elsif'を作ることはできませんか? – Aleksey

+0

私はできますが、30以上のif文があり、それぞれにこの動作が必要です(20回のループ)。結果は極端に長くなり、私はこの振る舞いで何らかのループが可能かどうか疑問に思っています。 –

+0

私は理解していないようです。初期データとは何ですか? – Aleksey

答えて

2
input = [ 
    0,0,0,44,754,22,0,632,2,22,0,2, 
    nil,2,24,nil,666,90909,2,4,6,7, 
    2,7,3,2,2,7,1,8,6,3,2,19,5,46 
] 

(1..Float::INFINITY).step(4) do |i| 
    i = i.to_i # is float here 
    break Statement if i >= input.size 
    next if input[i].nil? || !input[i+1].zero? 

    keyword = Statement =~ /WHERE/ ? 'AND' : 'WHERE' 
    Statement.sub! "THIS", "#{keyword} #{input[i+7]} #{input[i+8]} THIS" 
end 
#⇒ "Statement WHERE 2 22 AND 2 AND 666 90909 THIS" 
+0

20倍のループではなく、非常に便利な、完璧で素晴らしいソリューションです。 –

1

ループを20回行うには、の方法を使用できます。

arr_index = 1 

20.times do 
    if arr_index < 1 
    operator = "WHERE" 
    else 
    operator = "AND" 
    end 


    if input[arr_index] != nil && input[arr_index + 1] == 0 
    Statement.sub! "THIS", "#{operator} #{input[arr_index + 7]} #{input[arr_index + 8]} THIS" 
    end 

    arr_index += 4 
end 

別のオプションは、別のデータ構造をあなたの入力配列の内容を変更したり、作成することです(例えば、ハッシュ、配列、ハッシュ、配列のハッシュの配列)を使用すると、ループのために必要な正確な値を持ちます。したがって、各繰り返しでインデックスを4ずつ増やす必要はありません。

ステムメートはクラスまたは定数でなければ、その名前は小文字(例:ステートメント)である必要があります。

幸運を祈る!

+0

ありがとう、それは便利すぎた。 –

0
n = 20 

"STATEMENT WHERE %s THEN" % (1..1+4*(n-1)).step(4).with_object([]) { |i,a| 
    a << "#{ input[i+7] } #{ input[i+8] }" unless input[i].nil? || input[i+1] != 0 }. 
    join(" AND ") 
    #=> "Statement WHERE 2 22 AND 2 AND 666 90909 THEN"