2016-02-12 3 views
1
val paths @ Array(key_dc_outputDirectory, key_dc_path) = Array("DC_BIN", "DC_PATH") 

но ниже дает ошибку компилятора:Как сопоставить рисунок на карте?

val map @ Map(p1, p2) = Map("key1" -> "value1", "key2" -> "value2") 

значение Карта не является случай класса, а также не имеют изменения внесенные/unapplySeq член

Что такое правильный синтаксис, чтобы избежать ошибки?

+0

Как правило, вы не можете выполнять такую ​​операцию на карте, поскольку она не гарантирует никаких гарантий относительно упорядочения элементов. –

+0

@Chris: cte - ошибка времени компиляции. я обязательно буду использовать полную форму в будущих сообщениях. – mogli

ответ

2

Проблема заключается в том, что у 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.

Смежные вопросы