优化Ruby检测语句

时间:2014-09-04 07:54:32

标签: ruby

这是一种具有默认值的switch语句:

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

如何使这句话更紧凑?

我不喜欢几件事:

  • 从detect返回一个子数组,而不是返回它的第二个元素
  • 默认值定义为[nil, 'default'],而不是简单'default'
  • 默认值必须包含在Proc.new

2 个答案:

答案 0 :(得分:1)

使用Hash数据结构并利用方法#fetch

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

以下是文档: -

  

从给定键的哈希值返回一个值。如果找不到密钥,则有几个选项:没有其他参数,它将引发KeyError异常;如果给出默认,那么将返回;如果指定了可选代码块,那么将运行该代码块并返回其结果。

答案 1 :(得分: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时都不会创建它。