2012-04-17 45 views
222

最好的辦法我可以描述多個值就是我要找的是向您展示失敗代碼迄今我已經試過:Case語句,在每個「當」阻止

case car 
    when ['honda', 'acura'].include?(car) 
    # code 
    when 'toyota' || 'lexus' 
    # code 
end 

我已經得到約4或5個不同的when情況,應該由大約50個不同的可能值car觸發。有沒有辦法做到這一點與case塊,或者我應該嘗試一個大塊if塊?

回答

486

case聲明中,,相當於if語句中的||

case car 
    when 'toyota', 'lexus' 
     # code 
end 

Some other things you can do with a Ruby case statement

+0

莫大的聯繫,謝謝! – Nick 2012-04-17 19:08:44

+1

[此鏈接](http://ilikestuffblog.com/2008/04/15/how-to-write-case-switch-statements-in-ruby/)對Ruby中的case語句有更好的總結(它包括也是正則表達式和splat語法的例子)。 – rsenna 2013-02-20 18:59:20

+0

我不知道爲什麼,但這種奇怪的情況發生: 當我寫這篇文章: '時,「豐田」,「雷克薩斯」', 我得到: '意外tSTRING_BEG,期待keyword_do或「{」或' (」(的SyntaxError)' 然而,當我寫這篇文章:。。。。 '當 「豐田」, 「雷克薩斯」', 它的工作原理 唯一不同的是逗號後的空間 – 2014-11-10 08:23:27

77

您可能需要紅寶石的 「圖示」 或壓扁語法的優勢。

這使得長滿了when子句 - 如果我理解正確的話,你有大約10個值來測試每個分支 - 在我看來,它更具可讀性。另外,您可以修改要在運行時測試的值。例如:

honda = ['honda', 'acura', 'civic', 'element', 'fit', ...] 
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...] 
... 

if include_concept_cars: 
    honda += ['ev-ster', 'concept c', 'concept s', ...] 
    ... 

case car 
when *toyota 
    # Do something for Toyota cars 
when *honda 
    # Do something for Honda cars 
... 
end 

另一種常見的方法是使用哈希作爲調度表,與鍵的car每個值和一些調用對象封裝要執行的代碼值。

+0

在@ Nick的案例中絕對更具可讀性。 (沒有雙關語意思) – 2012-04-17 19:30:03

+0

這就是我最終使用的東西,雖然我很不好意思帶走了某人的複選標記:D – Nick 2012-04-17 19:44:41

+0

長時間線條的絕妙解決方案。感謝分享。 – Pistos 2016-04-20 14:50:25

0

另一種很好的方式,把你的邏輯數據是這樣的:

# Initialization. 
CAR_TYPES = { 
    foo_type: ['honda', 'acura', 'mercedes'], 
    bar_type: ['toyota', 'lexus'] 
    # More... 
} 
@type_for_name = {} 
CAR_TYPES.each { |type, names| names.each { |name| @type_for_name[type] = name } } 

case @type_for_name[car] 
when :foo_type 
    # do foo things 
when :bar_type 
    # do bar things 
end