2013-08-04 60 views
0

我很好奇,如果有方法让程序返回if语句栈?有没有办法'嵌套'if语句树'cd ..'?

理想情况下,程序将返回到第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 
+0

你是什么意思“回到顶级if语句”?接下来会发生什么? – Femaref

+0

在这段代码中,如果你总是返回到顶级if语句(而不是'input = gets.chomp'),它将永远循环,我有强烈的感觉表明这一点。 – Anton

+0

这是编写连续代码的非常糟糕的方式 – Mchl

回答

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循环以这种方式工作。

0

在显示的代码中,您不需要执行任何操作就可以使执行流回到第2行。只需在您标记的两个地方省略else子句。执行流程将下降到了while循环,然后循环的底部重回巅峰,然后回到线路2

0

你能避免这个级别neasted IFS的搭配:

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 
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。 Matz,Ruby的主要人物,recommends loop。有关它的进一步讨论,请参阅“Is there a “do … while” loop in Ruby?”。

+0

您发布的链接对'while ... end'没有任何反应。他反对'开始......结束......而......',因为它看起来不像什么。 (我更喜欢'loop do') –