Ответ 1
Я бы назвал это "съел твой пирог и у него тоже был оператор". На любом уровне в сопоставлении с образцами вы можете дать часть имени (до @) и деконструировать ее дальше (после @). Например, представьте, что вы хотите сопоставлять List с 3 элементами, вам нужен второй элемент, но вы хотите зарегистрировать весь список:
something match {
case [email protected](_,elem,_) => log("matching:" + list); elem
case _ => error("not found")
}
Без этой функции вам нужно было написать что-то вроде
something match {
case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem
case _ => error("not found")
}
Как вы можете видеть, нам нужно назвать первый и третий элементы, просто потому, что нам нужны они, чтобы получить список с той же структурой с правой стороны, который является шаблоном. Гораздо проще и понятнее, если вы можете дать все имя (list
), а также части, более глубокие в структуре (elem
), когда вам нужно как с правой стороны.