/ / Ruby - Loop IF x пъти и променя състоянието - рубин

Ruby - Loop IF x пъти и промяна състояние - рубин

Бих искал да преместя 20 пъти над оператор if, но всеки път, когато се изпълнява, някои неща трябва да се променят.

Пример:

    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. Всеки ключ се е увеличил с 4 (1,2,8,9 става 5,6,12,13)
  2. Думата WHERE е променена на AND

Бих искал това поведение да се повтори още 18 пъти, така че третото изявление на IF да има:

  1. Всеки ключ се е увеличил с 4 (5,6,12,13 става 9,10,16,17)
  2. Думата HELLO е променена на GOODBYE (но това правило вече е излишно, тъй като второто IF изявление се е погрижило за него).

Отговори:

2 за отговор № 1
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"

1 за отговор № 2

За да прекъснете 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 при всяка итерация.

Също така, освен ако Stamement е клас или константа.

Късмет!


0 за отговор № 3
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"