How is pattern matching in Scala implemented at the bytecode level?

后端 未结 4 1185
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-04 06:24

How is pattern matching in Scala implemented at the bytecode level?

Is it like a series of if (x instanceof Foo) constructs, or something else? What are

4条回答
  •  天命终不由人
    2020-12-04 06:32

    The low level can be explored with a disassembler but the short answer is that it's a bunch of if/elses where the predicate depends on the pattern

    case Sum(l,r) // instance of check followed by fetching the two arguments and assigning to two variables l and r but see below about custom extractors 
    case "hello" // equality check
    case _ : Foo // instance of check
    case x => // assignment to a fresh variable
    case _ => // do nothing, this is the tail else on the if/else
    

    There's much more that you can do with patterns like or patterns and combinations like "case Foo(45, x)", but generally those are just logical extensions of what I just described. Patterns can also have guards, which are additional constraints on the predicates. There are also cases where the compiler can optimize pattern matching, e.g when there's some overlap between cases it might coalesce things a bit. Advanced patterns and optimization are an active area of work in the compiler, so don't be surprised if the byte code improves substantially over these basic rules in current and future versions of Scala.

    In addition to all that, you can write your own custom extractors in addition to or instead of the default ones Scala uses for case classes. If you do, then the cost of the pattern match is the cost of whatever the extractor does. A good overview is found in http://lamp.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf

提交回复
热议问题