0

我很好奇是否有办法让程序回到if语句堆栈?

理想情况下,程序会返回到第 2 行并提示用户输入变量,然后像第一次一样继续计算。把它想象成文本编辑器中的光标,我只想将它从这两个注释中的任何一个移回第 2 行。下面将两个感兴趣的地方注释掉:

while true
input = gets.chomp
    if input != input.upcase
        puts "HUH?! SPEAK UP, SONNY!"
    elsif input == 'BYE'
        puts "HUH?! SPEAK UP, SONNY!"
        input = gets.chomp
        if input == 'BYE'
            puts "HUH?! SPEAK UP, SONNY!"
            input = gets.chomp
                if input == 'BYE'
                    puts "GOOD BYE!"; 
                    break   
                else
                    # return to top-level if statement
                end     
        else
            # return to top-level if statement
        end
    else
        random_year = rand(1930..1950)
        puts "NO, NOT SINCE #{random_year}!"
    end
end
4

4 回答 4

0

在您显示的代码中,您无需执行任何操作即可使执行流程回到第 2 行。只需省略else您标记的两个地方的子句即可。执行流程将下降到while循环的底部,然后循环回到顶部,然后返回到第 2 行。

于 2013-08-04T16:26:25.657 回答
0

这是我编写类似练习的方式:

BYE = 'BYE'
HUH = "HUH?! SPEAK UP, SONNY!"

loop do
  input = gets.chomp

  if input != input.upcase
    puts HUH
    next
  end

  if input != BYE
    random_year = rand(1930..1950)
    puts "NO, NOT SINCE #{random_year}!"
    next
  end

  puts HUH
  input = gets.chomp

  if input == BYE

    puts HUH
    input = gets.chomp

    if input == BYE

      puts "GOOD BYE!"; 
      break   

    end     

  end

end

我用loop而不是while. Ruby 的主要负责人 Matz建议使用loop. 有关它的进一步讨论,请参阅“ Ruby 中是否存在“do ... while”循环? ”。

于 2013-08-04T16:58:29.387 回答
0

您需要使用语句来设置条件标志并检查它,如果您不更改标志while,它将循环回到该语句:while

flag = 0
while flag1 == 0
  if var = "string"
  then ...statements...
  flag1 = 1      ; this allows us to break out of this while loop
  else ...statements...
  end
end

如果语句flag1末尾不为 0 while,则while语句将循环返回。对于两个这样的条件,您需要嵌套while循环。您可能必须重新排序语句才能使多个while循环以这种方式工作。

于 2013-08-04T14:46:54.123 回答
0

您可以通过以下方式避免这种级别的嵌套 if:

byecount = 0
while byecount < 3
  input = gets.chomp

  if input == "BYE"
    byecount += 1
    next
  else
    byecount = 0
  end

  if input != input.upcase
    puts "HUH?! SPEAK UP, SONNY!"
  else
    puts "NO, NOT SINCE #{rand(1930..1950)}!"
  end
end
puts "GOOD BYE!"

或者你可以编写一个 catch..throw 流结构。(真的..如果你需要使用它,你的设计有问题)

catch :exitloop do
  while ...
    if ...
      if ...
        if ...
          throw :exitloop
        end
      end
    end
  end
end
于 2013-08-04T16:52:15.487 回答