【发布时间】:2015-10-07 14:44:09
【问题描述】:
我是 Scala 新手。在我之前的post 中,有人提供了一段我无法正确理解的代码。
type JsonMap = Map[String, Any]
def getMapDiffs(mapBefore: JsonMap, mapAfter: JsonMap) : (JsonMap, JsonMap) = {
val sameKeys = mapBefore.keySet intersect mapAfter.keySet
val startAcc = (Map.empty[String, Any], Map.empty[String, Any])
sameKeys.foldLeft(startAcc){ case (acc @ (deltaBefore, deltaAfter), key) =>
(mapBefore(key), mapAfter(key)) match {
// two maps -> add map diff recursively to before diff and after diff
case (beforeMap: Map[_, _], afterMap: Map[_, _]) =>
val (deltaB, deltaA) =
getMapDiffs(beforeMap.asInstanceOf[JsonMap], afterMap.asInstanceOf[JsonMap])
(deltaBefore + (key -> deltaB), deltaAfter + (key -> deltaA))
// values before and after are different
// add values to before diff and after diff
case (beforeValue, afterValue) if beforeValue != afterValue =>
(deltaBefore + (key -> beforeValue), deltaAfter + (key -> afterValue))
// keep existing diff
case _ => acc
}
}
}
有人可以向我解释case _ => acc 在做什么吗?
如果有人想深入解释所有代码也可以,因为我正在尝试处理函数式编程。
干杯!
【问题讨论】:
-
你问的是
_还是@?标题说明了一件事,但帖子说明了另一件事。 -
@Rex Kerr,这还不清楚。我想我的问题应该是:
case _ => acc如何与(acc @ (deltaBefore, deltaAfter)交互。我研究并发现了一个post,它解释了@ 符号。但在这种情况下我无法理解它。 -
(acc @ (deltaBefore, deltaAfter)匹配两个 Map 的元组。元组被提取,其内容绑定到deltaBefore和deltaAfter。但是,在代码中,您还需要将元组本身按原样传递给下一次迭代。您还可以使用 @ 将元组本身绑定到本地 val。所以上面的情况也可以写成case acc => val (deltaBefore, deltaAfter) = acc ...。更新我的答案以包括其中的一些内容。 -
@Sascha,谢谢你的澄清。
标签: scala