gpt4 book ai didi

scala - 针对 Scala Map 条目的模式匹配

转载 作者:行者123 更新时间:2023-12-04 08:52:33 25 4
gpt4 key购买 nike

是否有任何 Scala 技巧可以针对 map 键启用模式匹配?换句话说,我想要一个在 Map 实例旁边也接受一个键值的提取器,这意味着我希望这个模式仅在可匹配值是 Map 的一个实例并且有一个具有给定键的条目时才匹配在它和这个条目的值受到递归模式匹配的影响。

像这样的东西:

myMap match {
case MyMap("a")(a) => // do smth with value a
case MyMap("b")(MyMap("c")(c)) => // do smth with value c
}

更新:

我找到了一些接近目标的方法,但它仍然不完美,因为它暗示了合成键值持有者的定义:
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")
}

类似问题: Can extractors be customized with parameters in the body of a case statement (or anywhere else that an extractor would be used)?

功能请求: 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)
}

返回类型是 Option[Unit] 因为我们使用 collectFirst 和 println

关于scala - 针对 Scala Map 条目的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18586541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com