模式匹配是在编译或运行时解决的吗?

时间:2015-08-20 12:01:10

标签: scala compilation pattern-matching

以下内容:

wal_keep_segments

是执行代码在编译时直接链接到匹配的argument match { case A => **executed code** ... 的模式,还是“简单地”在运行时解决了某种强大的switch-case?

(我说的是离线编译,而不是JIT)

编辑:回答

问题接近重复。我认为这个答案会更明智:

问题How is pattern matching in Scala implemented at the bytecode level?解释了模式匹配被转换为一组if和else,根据模式选择。

因此在编译时没有解决,因为:

  • 编译器不直接链接到argument,w.rt参数类型
  • 因此,匹配(即if-else)在运行时计算

(我希望它之所以这样做是因为我非常肯定它至少在某些情况下可以)

另外,查看问题is it possible to remove jumps with final boolean on java jit?,JIT可能会实际执行此操作。不确定它在实践中的效果如何(我希望它取决于具体情况),但如果确实如此,那么在编译时处理模式匹配并不是必需的。

1 个答案:

答案 0 :(得分:2)

Scalac会将模式匹配编译为switchhttp://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.10)或一系列if / else语句。