編輯:這是一個老的bug長久以來固定在斯卡拉2.8及更高版本爲什麼空字符串與Seq.empty不匹配?
在各地的問題Pattern matching a String as Seq[Char]一些實驗,我遇到另一個奇怪的現象匹配跑。考慮下面的代碼,把字符串作爲字符序列:在空字符串""
正確地產生"Empty"
def %%&#(input: String) : String = {
val uha : Seq[Char] = input
uha match {
case Seq() => "Empty"
case Seq(first @ _, 'o', 'o') => "Bar"
case _ => "Oh"
}
}
調用的輸入。
但是,如果我重寫第一場比賽子句
case Seq.empty => "Empty"
的""
匹配失敗和違約條款,而不是匹配。
步行通過斯卡拉圖書館源代碼(你不應該在理想的世界:-))我相信Seq()
和Seq.empty
將導致RandomAccessSeq.empty
。顯然,這不符合上述現象,因爲只有Seq()
匹配空字符串。
UPDATE:在一些進一步的實驗這個問題可以被縮小到以下內容:
val list = List()
>>> list2: List[Nothing] = List()
val emptySeq = Seq.empty
list == emptySeq
>>> res1: Boolean = false
這基本上意味着,一個空Seq
自動等於Seq.empty
沒有。 因此,當匹配一個常量(與使用starblue建議的提取器相反)時,這種不等式會導致失敗的匹配。 將空的String
解釋爲序列時也是如此。
顯然,這將在Scala 2.8中解決。期待它。 – 2009-04-30 08:11:55
好的情況,但現在已過期,因爲錯誤已修復(可能已在幾年前)。什麼是Stackoverflow的政策,讓這些進入休息,所以它不會出現在搜索? – akauppi 2014-09-17 08:55:55