Я бы назвал это "съешь свой пирог и сделай это слишком оператором". На любом уровне сопоставления с образцом вы можете присвоить детали имя (до @) и дополнительно деконструировать его (после @). Например, представьте, что вы хотите сопоставить список с 3 элементами, вам нужен второй элемент, но вы хотите зарегистрировать весь список:
something match {
case list@List(_,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
), когда вам нужно оба с правой стороны.