2014-09-04 68 views
-1

這是一種switch聲明的默認值:優化紅寶石檢測聲明

def test(st) 
    [[2, 'info'], 
    [3, 'warning'], 
    [4, 'danger'], 
    [5, 'success']].detect(Proc.new{[nil, 'default']}){|el| el[0]==st}[1] 
end 

如何使這種說法更加緊湊?

我不喜歡的幾件事情:

  • 的子陣列從檢測,而不是返回它返回的是
  • 默認值被定義爲[nil, 'default'],而不是簡單的'default'
  • 默認的第二個元素值必須包裝成Proc.new
+2

如何使用'test'? – sawa 2014-09-04 07:56:33

+1

任何不使用'case'語句的理由? – Stefan 2014-09-04 08:02:05

+0

@Stefan:更多代碼 – Paul 2014-09-04 08:21:12

回答

1

使用Hash數據結構並採取先進該方法#fetch

def test(st) 
    { 2 => 'info', 3 => 'warning', 
    4 => 'danger',5 => 'success' 
    }.fetch(st,'default') 
end 

這裏踏歌是文檔: -

從哈希給定鍵返回一個值。如果找不到密鑰,則有以下幾種選擇:如果沒有其他參數,則會引發KeyError異常;如果默認給出,那麼將返回;如果指定了可選代碼塊,那麼將運行該代碼塊並返回其結果。

+1

有一種趨勢:有更多聲望的人在沒有任何額外問題的情況下能夠抓住重點:)謝謝!令人驚歎的答案! – Paul 2014-09-04 08:29:47

1

您可以使用哈希使它直接查找值。然後,您還可以利用哈希的默認值能力,將default傳遞到new

def test(st) 
    map = Hash.new('default') 
    map.merge!({ 
    2 => 'info', 
    3 => 'warning', 
    4 => 'danger', 
    5 => 'success' 
    }) 
    map[st] 
end 

我也建議你只創建map哈希一次,外面的test方法的地方,它的浪費,以保持每次test被稱爲創造它。