2012-11-03 45 views
4

我正在尋找一個跳過執行when塊的語句,類似於break for循環。這可能嗎?在ruby的case/when語句中,「break」等價嗎?

我想避免的是像一個結構:

case n 
    when 1 
    if valid 
     foo.bar 
    end 
    when 2 
    if valid 
     foo.foo 
    end 

更加理想的代碼塊看起來像:

case n 
    when 1 
    break unless valid 
    foo.bar 
    when 2 
    break unless valid 
    foo.foo 
    end 

顯然,break不起作用。

+2

我認爲你的設計有問題。你的代碼中甚至不應該有這麼大的'case'語句。也許你可以使用字典將'n'的值映射到一個函數來調用或者什麼。如果您使用了一個更具體的示例來展示您的真實問題,我們可以提供更多幫助。這可能是codereview.SE的情況,儘管 –

+0

我試圖解析一個日誌文件。各種'when'語句代表正則表達式,我想檢查這條線。問題在於我可能不得不忽略一些行,這取決於某些條件(在前面的例子中是'valid')。 – nTraum

+1

我不明白是什麼使你的例子中使用break的版本更可取。 – sepp2k

回答

6

,等價但更簡潔:

case n 
    when 1 
    foo.bar if valid 
    when 2 
    foo.foo if valid 
    end 
end 
如果條件真的適用於所有情況下

,你可以事先檢查一下:

if valid 
    case n 
    when 1 
     foo.bar 
    when 2 
     foo.foo 
    end 
    end 
end 

如果既沒有爲你工作,那麼答案很簡單:沒有,在Ruby語句中沒有相應的break

+0

該條件不適用於所有情況,不幸的是,我還必須執行多個語句。我可能不得不考慮將它們組合到一個我猜想的方法。 – nTraum

+2

我覺得你的意思是'foo.bar if valid'等。 –

+0

當然糾正了。謝謝。 – Thilo

2

我總是對Ruby語句結尾添加條件的迷。它使代碼更簡單,更易讀。這是紅寶石所知道的。我對你的問題的回答看起來像這樣:

case n 
when 1 
    foo.bar 
when 2 
    bar.foo 
end unless !valid 
+2

+1,但對我來說,說'case n ... end if valid'而不是'except only valid'會更有意義。 – maerics