2016-07-01 4 views
1

Я хотел бы цикл 20 раз над выражением if, но каждый раз, когда он запускается, некоторые вещи должны меняться.Ruby - Loop IF x times and change condition

Пример:

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 

В втором IF заявлении следующие вещи изменились:

  1. Каждый ключ увеличился на 4 (1,2,8,9 стал 5,6,12 , 13)
  2. слово WHERE изменилось к И

Я хотел бы это поведение, чтобы повторить еще 18 раз, так что третий IF оператор имеет:

  1. Каждый ключ увеличился на 4 (5,6,12,13 стал 9,10,16,17)
  2. Слово ПРИВЕТ изменилось распрощаться (однако это правило сейчас избыточным, поскольку второй оператор IF позаботился об этом).
+0

так в чем проблема? не можете ли вы сделать 'if 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

Идеальное и приятное решение с перерывом, а не 20x, очень полезно. –

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"