我注意到没有|| 模式匹配时可用的运算符 - is | 短路?
问问题
518 次
2 回答
10
在模式匹配中,|
是短路的。您不能unapply
使用 or 运算符调用或类似(带有返回的参数),其中可能更有可能产生副作用。所以短路纯粹是一种优化技术(不会影响代码的正确性,除非在特殊情况下,例如副作用 equals 方法)。这确实意味着由于性能或副作用的原因,您的短路能力受到限制。
要看到这一点,如果我们编写以下代码:
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"
案例?这就是短路。
于 2013-10-21T21:53:13.847 回答
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
}
于 2013-10-21T23:26:37.430 回答