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

为什么Scala匹配优于if语句?,scala,pattern-matching,Scala,Pattern Matching,在Twitter的文章中,他们说: 使用返回来澄清和增强可读性,但不要像您希望的那样 用命令式语言;避免使用它们返回搜索结果 计算而不是 首选: 但使用匹配表达式优于以下两种方法之一: 在这个特定的示例中为什么匹配表达式比if/else优越?模式匹配的关键是数据类型提取。有关示例和讨论,请参见示例和 在上面的例子中,数据类型被证明是微不足道的,其好处可能主要来自可读性。模式匹配的关键是数据类型提取。有关示例和讨论,请参见示例和 在上面的示例中,数据类型被证明是微不足道的,其好处可能主要来自可读性

在Twitter的文章中,他们说:

使用返回来澄清和增强可读性,但不要像您希望的那样 用命令式语言;避免使用它们返回搜索结果 计算而不是

首选:

但使用匹配表达式优于以下两种方法之一:


在这个特定的示例中为什么匹配表达式比if/else优越?

模式匹配的关键是数据类型提取。有关示例和讨论,请参见示例和


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

模式匹配的关键是数据类型提取。有关示例和讨论,请参见示例和


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

一般来说,
match
更具可读性,并且更清楚地解释了您的意图。但在这个确切的例子中,它还有一个额外的好处,
match
将不会发出一系列
if
s,而是发出一条
开关
字节码指令(本例中的指令),这可能会稍微提高性能

您可以断言在这种情况下,
开关
将与注释一起发出:

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

一般来说,
match
更具可读性,更清楚地解释您的意图。但在这个确切的例子中,它还有一个额外的好处,
match
将不会发出一系列
if
s,而是发出一条
开关
字节码指令(本例中的指令),这可能会稍微提高性能

您可以断言在这种情况下,
开关
将与注释一起发出:

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

可能会稍微提高性能。
比特
的含义有任何粗略估计吗?@KevinMeredith在字节码中,它用一条表开关指令取代了3次比较(+堆栈上的变量加载)。对于3个比较来说,它应该是非常小的,除非它处于某个紧密的循环中。但是在紧密的循环中,JIT起作用,然后事情可能会有很大的变化。此外,这种“为匹配发出开关”的行为非常脆弱:它只适用于针对文字常量和
final val
标识符的匹配。尽管如此,
match
从可读性和编码风格角度来看还是更好的。因此,它属于“避免过早悲观”的情况:如果s
可能会稍微提高性能,那么它总是比序列
更可取。
任何关于
一位
意味着什么的粗略估计?@KevinMeredith在字节码中它实际上取代了3个比较(+堆栈上的可变负载)使用单个表开关指令。对于3个比较来说,它应该是非常小的,除非它处于某个紧密的循环中。但是在紧密的循环中,JIT起作用,然后事情可能会有很大的变化。此外,这种“为匹配发出开关”的行为非常脆弱:它只适用于针对文字常量和
final val
标识符的匹配。尽管如此,
match
从可读性和编码风格角度来看还是更好的。因此,它属于“避免过早悲观”的情况:它总是比一系列的
if
s更可取
def suffix(i: Int) = i match {
  case 1 => "st"
  case 2 => "nd"
  case 3 => "rd"
  case _ => "th"
}
def suffix(i: Int) = (i: @switch) match {
  case 1 => "st"
  case 2 => "nd"
  case 3 => "rd"
  case _ => "th"
}