Jiř*_*řík 7 scala pattern-matching extractor
是否有任何Scala技巧可以启用与地图键的模式匹配?换句话说,我想在Map实例旁边有一个提取器也接受一个键值,这意味着只有当matchable值是Map的一个实例并且有一个带有给定键的条目时,我希望这个模式匹配在其中,此条目的值受递归模式匹配的影响.
像这样的东西:
myMap match {
case MyMap("a")(a) => // do smth with value a
case MyMap("b")(MyMap("c")(c)) => // do smth with value c
}
Run Code Online (Sandbox Code Playgroud)
更新:
我找到了一些接近目标的方法,但它仍然不完美,因为它意味着合成键值持有者的定义:
case class MapKey[K](key: K) {
def unapply(o: Any) = o match {
case m: Map[K, _] ? m.get(key)
case _ ? None
}
}
val m1 = Map("a" ? "aa", "b" ? Map("c" ? "cc"))
val m2 = Map("a" ? "aa", "d" ? "dd")
val b = MapKey("b")
val c = MapKey("c")
val d = MapKey("d")
for (m ? List(m1, m2)) m match {
case b(c(x)) ? println(s"b > c: $x")
case d(x) ? println(s"d: $x")
}
Run Code Online (Sandbox Code Playgroud)
类似的问题:可以在case语句的主体中(或者在使用提取器的任何其他地方)使用参数自定义提取器吗?
特征要求:SI-5435
也许您正在寻找您并不真正需要的解决方案?无法想象这里的提取器。如果你想匹配键值对,可以使用 PF:
val map = Map[String, String]("a" -> "b")
def matchTuple[A,B,C](map: Map[A,B])(pf: PartialFunction[(A,B), C]) =
map.collectFirst(pf)
matchTuple(map) {
case ("a", b) => println("value for a is " + b)
}
Run Code Online (Sandbox Code Playgroud)
返回类型是 Option[Unit] 因为我们使用了collectFirst和println
归档时间: |
|
查看次数: |
4244 次 |
最近记录: |