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"案例?那是短路.
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |