Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在地图上进行模式匹配?_Scala - Fatal编程技术网

Scala 如何在地图上进行模式匹配?

Scala 如何在地图上进行模式匹配?,scala,Scala,但下面给出了一个编译器错误: val paths @ Array(key_dc_outputDirectory, key_dc_path) = Array("DC_BIN", "DC_PATH") 值映射不是case类,也没有unapply/unplyseq成员 避免错误的正确语法是什么?问题显然是Map没有unplyseq方法。拥有它可能没有多大意义,因为您不知道以什么顺序获取元素 无论如何,我最接近的是: val map @ Map(p1, p2) = Map("key1" -> "

但下面给出了一个编译器错误:

val paths @ Array(key_dc_outputDirectory, key_dc_path) = Array("DC_BIN", "DC_PATH")
值映射不是case类,也没有unapply/unplyseq成员


避免错误的正确语法是什么?

问题显然是
Map
没有
unplyseq
方法。拥有它可能没有多大意义,因为您不知道以什么顺序获取元素

无论如何,我最接近的是:

val map @ Map(p1, p2) = Map("key1" -> "value1", "key2" -> "value2")
或者更简短地说:

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 map@MapOops(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)
用这样的东西拉皮条是没有意义的:

隐式类MapOops[K,V](val m:Map[K,V])扩展了AnyVal

因为在模式匹配中使用
Map
时,不会发生隐式转换,因为没有请求/暗示
MapOops
类型

例如:
case-Map(…)
val-Map(…)
将需要类型
Map
,而不是
MapOops
,因此不会发生隐式转换,也不会找到
unallyseq
方法。如果显式使用
MapOops
,则不需要隐式转换


如果您经常使用这种模式,那么您可能会发现这个helper类很有用,否则一个更合理的解决方案是像@jwvh的回答中那样进行额外的转换。

通常您不能在映射上执行这种操作,因为它不能保证元素的顺序。@Chris:cte是编译时错误。我会确保在以后的帖子中使用完整的表格。。
scala> val map@MapOops(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)