使用hash或case-statement [Ruby]

时间:2010-05-09 20:29:32

标签: ruby hash case

一般来说哪个更好用?:

case n
when 'foo'
 result = 'bar'
when 'peanut butter'
 result = 'jelly'
when 'stack'
 result = 'overflow'
return result

map = {'foo' => 'bar', 'peanut butter' => 'jelly', 'stack' => 'overflow'}
return map[n]

更具体地说,我应该何时使用case-statement,何时应该使用hash?

3 个答案:

答案 0 :(得分:11)

哈希是一种数据结构,case语句是一种控制结构。

当您只是检索某些数据时(例如您提供的示例中),您应该使用哈希值。如果需要执行其他逻辑,则应编写案例陈述。

此外,如果您需要执行某些模式匹配,则使用case语句是有意义的:


#pattern matching using ranges
letterGrade = case score
   when 0..64 then "F"
   when 65..69 then "D"
   when 70..79 then "C"
   when 80..89 then "B"
   when 90..100 then "A"
   else "Invalid Score"
end

#pattern matching using regular expressions
case songData
  when /title=(.*)/
    puts "Song title: #$1"
  when /track=(.*)/
    puts "Track number: #$1"
  when /artist=(.*)/
    puts "Artist name: #$1"
end


答案 1 :(得分:8)

一般来说,编程中的“更好”意味着不同的东西。例如,更好的程序

  1. 更容易理解,即 更好地表达意图
  2. 更容易维护。例如, 减少代码行数 容易出错等。
  3. 就此而言,
  4. 具有更好的表现 执行时间
  5. 就此而言,
  6. 具有更好的表现 内存使用
  7. 由于我们讨论的是Ruby,因此性能通常不太重要。如果您确实需要性能,可以考虑另一种编程语言。所以,我先看看标准(1)和(2)。看起来更好的Ruby代码通常代表一个“更好”的程序。哪个代码看起来更好?哪个表达意图更好?如果添加/删除逻辑,哪个更容易修改?这取决于你的问题,这在某种程度上是一种品味问题。

    对我而言,在您的简短示例中,哈希解决方案更好。案例解决方案提供了更大的灵活性,在这种情况下您不需要(但在其他情况下可能需要)。

答案 2 :(得分:3)

哈希表和案例陈述之间存在两个主要区别。

  1. 哈希表可以在词法环境中存储,修改和重用,而case语句则不能。它产生一个结果,然后消失。但请注意,如果case语句在块/方法中,当然可以通过多次调用块/方法多次使用(但不容易修改)。
  2. 哈希表文字表达式总是计算其所有键和值,而case语句只计算它需要的“键”和它将返回的“值”。这通常是更重要的区别,因为正如Derek B.所指出的那样,这些值可能涉及额外的逻辑,如果只需要其中一个值,那么执行这些逻辑可能会非常昂贵。
  3. case n
    when 'foo'
     'bar'
    when 'peanut butter'
     'jelly'
    when 'stack'
     'overflow'
    end
    

    这相当于你的代码,在使用Ruby或函数式编程语言一段时间之后,它对你来说会更自然。它也更短。