2014-09-04 66 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被称为创造它。