我在scala中编写了以下用例:
val wordShortcut = Map("volume" -> "vol", "report" -> "rpt", ...)
object WordShortcutCase {
def unapply(key: String): Option[String] = wordShortcut.get(key)
}
val pluralR = "(.+)s".r
def encodeToken(token: String) = token match {
case WordShortcutCase(short) => short
case pluralR(singular) => singular
case _ => token
}
如果scala Map
会实现unapply
,我就不需要额外的WordShortcutCase
对象(我可以使用case wordShortcut(short) => short
代替`)。这似乎是我常见的模式。
所以问题是为什么scala Map
没有实现unapply
方法?
答案 0 :(得分:1)
Map
未实现unapply
,因为没有合理的实现与其他集合具有相同的特征。
特别是,您似乎希望apply
和unapply
基本上做同样的事情。但这不是其他收藏品的运作方式;他们将变量绑定到内容并期望列表是详尽的(在没有绑定到“其余”的情况下):
val xs = List("fish")
val ys = List("fish", "dish")
def iam(zs: List[String]) = zs match {
case List(x) => println(s"I am a $x")
case _ => println("Who am I??")
}
iam(xs) // Prints 'I am a fish'
iam(ys) // Prints 'Who am I??'
如果Map
不一个集合,则可以自由地实现unapply
作为另一种方式来执行apply
,更像是正则表达式(尽管有,请注意,关键功能是能够将多个变量绑定到正则表达式匹配的部分)。但是既然如此,由于与其他集合的不同,具有类似正则表达式的unapply会非常混乱;并且因为地图是无序的并且unapplySeq是有序的,所以与其他集合具有相同的不适用性也会令人困惑。所以它没有一个。