Проблема заключается в том, что у Map
нет метода unapplySeq
. Возможно, это не имеет большого смысла, потому что вы не знаете, в каком порядке вы получите свои элементы.
Во всяком случае, ближе всего я мог добраться до это:
scala> object MapOops {
| def apply[K,V](ps: (K,V)*): Map[K,V] =
| ps.toMap
|
| def unapplySeq[K,V](m: Map[K,V]): Option[Seq[(K,V)]] =
| if(m.isEmpty) None else Some(m.toSeq)
| }
defined object MapOops
scala> val [email protected](p1, p2) = MapOops(1 -> "one", 2 -> "two")
map: Map[Int,String] = Map(1 -> one, 2 -> two)
p1: (Int, String) = (1,one)
p2: (Int, String) = (2,two)
или, еще короче:
scala> val [email protected](p1, p2) = Map(1 -> "one", 2 -> "two")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> one, 2 -> two)
p1: (Int, String) = (1,one)
p2: (Int, String) = (2,two)
Это не имеет смысла сутенеру Map
с чем-то вроде этого:
implicit class MapOops[K,V](val m: Map[K,V]) extends AnyVal
Потому что, когда вы используете Map
в шаблоне соответствия неявное преобразование может произойти с MapOops
тип не запрашивается/подразумевается.
Например: case Map(...)
или val Map(...)
требует типа Map
, не MapOops
так неявное преобразование не будет иметь место и unapplySeq
метод не будет найден. И если вы используете явно MapOops
, то не требуется неявное преобразование.
Если вы используете этот шаблон много, вы можете найти этот вспомогательный класс полезным, иначе более разумным решением будет добавление дополнительного преобразования, как в ответе @ jwvh.
Как правило, вы не можете выполнять такую операцию на карте, поскольку она не гарантирует никаких гарантий относительно упорядочения элементов. –
@Chris: cte - ошибка времени компиляции. я обязательно буду использовать полную форму в будущих сообщениях. – mogli