Ruby-如果x次循环并改变条件

Ruby-如果x次循环并改变条件,ruby,Ruby,我想在if语句上循环20次,但每次它运行时,有些事情必须改变 例如: 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", "WHER

我想在if语句上循环20次,但每次它运行时,有些事情必须改变

例如:

    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语句中,以下内容发生了变化:

  • 每把钥匙都增加了4(1,2,8,9变成了5,6,12,13)
  • 单词WHERE已改为AND
  • 我希望这种行为再重复18次,因此第三个IF语句:

  • 每把钥匙都增加了4(5,6,12,13变成了9,10,16,17)
  • HELLO一词已改为再见(不过,由于第二个IF语句处理了该规则,因此该规则现在是多余的)

  • 要循环20次,可以使用times方法

    arr\u索引=1
    20.5倍
    如果arr_指数<1
    operator=“WHERE”
    其他的
    运算符=“和”
    结束
    如果输入[arr_index]!=零和输入[arr_索引+1]==0
    声明.sub!“THIS”,“#{operator}#{input[arr_index+7]}#{input[arr_index+8]}THIS”
    结束
    arr_指数+=4
    结束
    
    另一个选项是更改输入数组的内容或创建另一个数据结构(例如,哈希、数组、哈希数组、数组哈希),并使用循环所需的精确值。因此,无需在每次迭代时将索引增加4

    此外,除非STAMENT是一个类或常量,否则约定其名称应为小写(例如,语句)

    祝你好运

    n=20
    
    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"
    
    语句,其中%s然后“%(1..1+4*(n-1))。步骤(4)。带_对象([]){i,a| “其中22和2以及666 90909的声明”
    那么问题出在哪里呢?你不能制作
    if elsif
    ?我可以,但我有30多个if语句,每个都需要这种行为(20个循环)。结果会非常长,我想知道这种行为是否可能出现某种循环。似乎我不明白。初始数据是什么?抱歉,我已经更新了问题代码。它按照我的需要工作,但我想在每个if中再执行18次,更改键号。我可以再编写18次代码,或者ps有一个更快的方法吗?完美而漂亮的解决方案,用中断代替20x循环,非常有用。谢谢,它也派上了用场。
    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"
    
    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"