2015-12-02 62 views
1

我必須用begin - rescue - end塊包圍一切。我寫的代碼看起來像:是否可以使用`retry`關鍵字與`if`內聯?

begin 
    bet = Dialogs.enter_your_bet 
    approx.calculate_average_profit(bet) 
    approx.print_profits_table 
    retry if Dialogs.play_again? 
rescue;retry 
end 

retry if Dialogs.play_again?引起以下錯誤:

./main:14: Invalid retry 
./main: compile error (SyntaxError) 

是否有可能使這種內嵌retry來沒有定期ifif條款的工作 - end多線方法?

+0

是的,這是可能的。我用它所有的時間。 – muichkine

+0

'rescue'用於處理異常。不要使用控制流的異常。 – Stefan

+0

如果發生異常,您是否要「重試」?或者如果條件滿足,是否要重新運行該塊?在第二種情況下,您可能想使用'while'塊... – spickermann

回答

1

好的,謝謝大家的回答!我明白什麼是問題,但你的解決方法不是我需要的。實際上,救援部分用於在用戶非法輸入的情況下重新啓動輸入提示,而我在開始內部的「重試」是從另一個用戶輸入(y/n問題)重新啓動阻止。

所以經過一番調查後,該代碼會工作得很好:

begin 
    loop do 
    bet = Dialogs.enter_your_bet(gapes[0],gapes[1]) 
    approx.calculate_average_profit(bet) 
    approx.print_profits_table 
    break if !Dialogs.play_again? 
    end 
rescue;retry 
end 

再次,感謝這麼赫然活躍的社區。保重!

+0

'if!Dialogs.play_again?'相當於'除非Dialogs.play_again?' – Stefan

+0

@Stefan是的,乖張。然而,我用'除非'關鍵字有一個可怕的頭痛,所以我擺脫了它:) – ddnomad

+0

請注意,如果出現異常,您將'重試'整個'循環'。我會將'loop'的主體包裝在'begin-rescue-end'塊中,並刪除'retry'。 – Stefan

4

retryrescue塊中工作(或在迭代器中)。它適用於if。試試這個:

begin 
    bet = Dialogs.enter_your_bet 
    approx.calculate_average_profit(bet) 
    approx.print_profits_table 
rescue 
    retry if Dialogs.play_again? 
end 
+0

只有在引發異常時纔會調用「rescue」塊。 – Stefan

+0

@Stefan是的,你是對的。這就是爲什麼這個實現不是我想要的(我的錯誤,也許我應該更清楚地解釋我需要的東西)。我自己回答了這個問題,並提供了一種可行的解決方法來使事情順利進行。 – ddnomad

0

redo用於控制流程。

引用文檔:「在Ruby 1.8中,您也可以在重做的地方使用重試。這不再是真的,現在當您在救援塊外使用重試時,您將收到SyntaxError。重試。」

+0

無法退出循環。 – Stefan

+0

@Stefan,真的。決定擺脫代碼。 – steenslag

相關問題