是| (或)在scala中进行模式匹配时短路?

Jas*_*onG 4 scala pattern-matching

我注意到没有|| 模式匹配时可用的运算符 - 是| 短路?

Rex*_*err 10

在模式匹配中,|是短路的.您不能unapply使用or-operator 调用或使用(带有返回的参数),因为副作用可能更有可能.因此,短路纯粹是一种优化技术(除非在特殊情况下,例如副作用等于方法,否则不会影响代码的正确性).这意味着您的性能或副作用原因限制了您的短路能力.

要看到这个,如果我们写这个代码:

def matchor(s: String) = s match {
  case "tickle" | "fickle" => "sickle"
  case _ => "hammer"
}
Run Code Online (Sandbox Code Playgroud)

我们看到这个字节码(部分)

public java.lang.String matchor(java.lang.String);
  Code:
   0:   aload_1
   1:   astore_2
   2:   ldc #12; //String tickle
   4:   aload_2
   5:   astore_3
   6:   dup
   7:   ifnonnull   18
   10:  pop
   11:  aload_3
   12:  ifnull  25
   15:  goto    31
   18:  aload_3
   19:  invokevirtual   #16; //Method java/lang/Object.equals:(Ljava/lang/Object;)Z
   22:  ifeq    31
   25:  iconst_1
   26:  istore  4
   28:  goto    66
   31:  ldc #18; //String fickle
   33:  aload_2
   ...
   66:  iload   4
   68:  ifeq    78
   71:  ldc #20; //String sickle
   73:  astore  6
   75:  goto    82
   ...
   82:  aload   6
   84:  areturn
Run Code Online (Sandbox Code Playgroud)

请参阅第28行的跳转以避免测试"fickle"案例?那是短路.