2013-08-04 58 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') –