为什么 scala Map 没有实现取消应用?



我在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
}

如果 ScalaMap能够实现unapply,我将不需要额外的WordShortcutCase对象(我可以使用case wordShortcut(short) => short代替')。这对我来说似乎是一种常见的模式。

所以问题是为什么 scalaMap没有实现unapply方法?

Map没有实现unapply,因为没有与其他集合具有相同特征的合理实现。

特别是,你似乎希望applyunapply做基本相同的事情。 但这不是其他集合的工作方式;它们将变量绑定到内容,并期望列表是详尽的(在没有绑定到"其余"的情况下):

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方式,更像正则表达式(尽管在那里,请注意,关键功能是能够将多个变量绑定到正则表达式匹配的一部分)。 但既然是这样,由于与其他集合不同,使用类似正则表达式的取消应用会非常混乱;而且由于地图是无序的,而 unapplySeq 是有序的,因此与其他集合具有相同的取消应用也会令人困惑。 所以它只是没有。

最新更新