Низкий уровень можно исследовать с помощью дизассемблера, но краткий ответ заключается в том, что это набор элементов if / elses, где предикат зависит от шаблона
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
Существует гораздо больше того, что вы можете сделать с такими шаблонами, как или шаблоны и комбинации, например "case Foo (45, x)", но в целом это всего лишь логические расширения того, что я только что описал. У шаблонов также могут быть элементы защиты, которые являются дополнительными ограничениями для предикатов. Есть также случаи, когда компилятор может оптимизировать сопоставление с образцом, например, когда есть некоторое совпадение между случаями, он может немного объединить вещи. Расширенные шаблоны и оптимизация являются активной областью работы компилятора, поэтому не удивляйтесь, если байт-код существенно улучшится по сравнению с этими основными правилами в текущих и будущих версиях Scala.
В дополнение ко всему этому вы можете написать свои собственные экстракторы в дополнение или вместо стандартных, которые Scala использует для case-классов. Если вы это сделаете, то стоимость сопоставления с образцом - это стоимость всего, что делает экстрактор. Хороший обзор можно найти в http://lamp.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf