2016-12-06 87 views
3

我寫階以下使用情況:爲什麼scala Map沒有實現無法應用?

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 
} 

如果斯卡拉Map將實施unapply,我就不需要額外的WordShortcutCase對象(我可以使用case wordShortcut(short) => short instead`)。這對我來說似乎是一種常見的模式。

所以問題是爲什麼scala Map沒有實現unapply方法?

+2

我不明白「Map」上的模式匹配是如何實現的。 'Map.get'對我來說更有意義。 –

+0

那麼map的'unapply'的返回類型是什麼? – Haspemulator

+1

這是1.罕見的場合。 2.語義上令人沮喪的是,奇怪的是'key'是'value'的'mapping',當你通常以相反的方式看到它時 – Odomontois

回答

1

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,更像是正則表達式(雖然在那裏,請注意,關鍵功能是能夠將多個變量綁定到正則表達式匹配的部分)。但是,既然是這樣,像正則表達式那樣的不應用會因爲與其他集合的區別而變得非常混亂;並且因爲地圖是無序的而且不適用的Seq被排序,所以與其他集合相同的不適用也會令人困惑。所以它只是沒有。

相關問題