带有箭头符号的 Map 上的 Scala 模式匹配
Scala pattern matching on Map with arrow symbol
List("a"->1, "b"->2) match { case List( k->v ,_*) => println(k) }
错误:未找到:值 ->
List("a"->1, "b"->2) match { case List( (k,v) ,_*) => println(k) }
成功
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.
List("a"->1, "b"->2) match { case List( k->v ,_*) => println(k) }
错误:未找到:值 ->List("a"->1, "b"->2) match { case List( (k,v) ,_*) => println(k) }
成功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.