为什么Scala匹配优于if语句?

时间:2015-11-29 14:07:40

标签: scala pattern-matching

在Twitter的Effective Scala文章中,他们说:

  

使用返回来澄清和增强可读性,但不是像你想的那样   用命令语言;避免使用它们来返回结果   计算。而不是

def suffix(i: Int) = {
  if      (i == 1) return "st"
  else if (i == 2) return "nd"
  else if (i == 3) return "rd"
  else             return "th"
}
  

喜欢:

def suffix(i: Int) =
  if      (i == 1) "st"
  else if (i == 2) "nd"
  else if (i == 3) "rd"
  else             "th"
  

但使用匹配表达式优于:

def suffix(i: Int) = i match {
  case 1 => "st"
  case 2 => "nd"
  case 3 => "rd"
  case _ => "th"
}

在此具体示例中,为什么匹配表达式优于if / else?

2 个答案:

答案 0 :(得分:4)

一般来说,match更具可读性,可以更清楚地说明您的意图。但是在这个确切的示例中,它有一个额外的好处,match不会发出一系列if s,而是发出switch字节码指令(tableswitch一个案例),这可能会提高一点性能。

您可以断言,在这种情况下,switch将使用@switch注释发出:

def suffix(i: Int) = (i: @switch) match {
  case 1 => "st"
  case 2 => "nd"
  case 3 => "rd"
  case _ => "th"
}

答案 1 :(得分:1)

模式匹配必不可少的是数据类型提取。有关示例和讨论,请参阅Extractor ObjectsThe Neophyte's Guide to Scala Part 1: Extractors

在上面的示例中,数据类型证明是微不足道的,其好处主要来自可读性。