我注意到没有||模式匹配时可用的运算符 - 是|短路?
答案 0 :(得分:10)
在模式匹配中,|
被短路。你不能用or-operator调用unapply
之类的(带有返回参数),副作用可能更有可能。因此,短路纯粹是一种优化技术(除非在特殊情况下,例如副作用等于方法,否则不会影响代码的正确性)。这意味着您的性能或副作用原因限制了您的短路能力。
要看到这一点,如果我们写下这段代码:
def matchor(s: String) = s match {
case "tickle" | "fickle" => "sickle"
case _ => "hammer"
}
我们看到这个字节码(部分)
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
请参阅第28行的跳转以避免测试"fickle"
案例?这就是短路。
答案 1 :(得分:3)
|
短路。
object First {
def unapply(str: String): Boolean = {
println("in First")
str == "first"
}
}
object Second {
def unapply(str: String) = {
println("in Second")
str == "second"
}
}
object Run extends App {
"first" match {
case First() | Second() => None
}
//Output: In First
"first" match {
case Second() | First() => None
}
//Output: In Second\nIn First
}