带有箭头符号的 Map 上的 Scala 模式匹配

Scala pattern matching on Map with arrow symbol

  1. List("a"->1, "b"->2) match { case List( k->v ,_*) => println(k) }
    错误:未找到:值 ->
  2. List("a"->1, "b"->2) match { case List( (k,v) ,_*) => println(k) }
    成功

  3. Map("a"->1, "b"->2) match { case Map( (k,v) ,_*) => println(k) }
    错误:value Map 不是 case class,也没有 unapply/unapplySeq 成员

你能解释一下为什么左边使用箭头 ->;而在右侧 -> 失败。
如果我将其更改为真实类型 Tuple (k,v),则成功。
但是,如果使用 Map 再次失败。 我无法想象 Scala 没有为 Map 实现 unapply?!


编辑: 我认为 :: 可以用于模式匹配; -> .
也可以 好的,现在 -> 是一个方法,所以无法匹配。 Scala 不直观。

-> 语法只是一个 shorthand 来创建一个元组。所以 'a' -> 1 实际上 returns 类型 (Char, Int)。由于它不是一种类型,因此您无法匹配该语法。而是匹配元组。

还有地图,我不确定是否有提取器。你通常需要和 unapplySeq 方法,它被定义为返回一个序列。非常语法 _* 意味着传递一系列参数,而 map 根据定义是一种无序结构。您始终可以使用 toSeq 来获取元组序列。

您的代码的第 1 版适用于 2.13。

似乎 ->unapply 是在 2.13.0 中添加的,即 PR Add -> alias for Tuple2 to Predef. The -> symbol is a value alias for Tuple2 case class companion object, see Predef source.