2009-04-11 39 views
2

編輯:這是一個老的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解釋爲序列時也是如此。

+1

顯然,這將在Scala 2.8中解決。期待它。 – 2009-04-30 08:11:55

+0

好的情況,但現在已過期,因爲錯誤已修復(可能已在幾年前)。什麼是Stackoverflow的政策,讓這些進入休息,所以它不會出現在搜索? – akauppi 2014-09-17 08:55:55

回答

4

這似乎是庫中的一個錯誤。你想提交錯誤還是應該?

scala> Seq.empty match {case Seq() => "yup"; case _ => "nope"} 
res0: java.lang.String = yup 

scala> Seq() match {case Seq.empty => "yup"; case _ => "nope"} 
res1: java.lang.String = yup 

scala> ("" : Seq[Char]) match {case Seq() => "yup"; case _ => "nope"}  
res2: java.lang.String = yup 

scala> ("" : Seq[Char]) match {case Seq.empty => "yup"; case _ => "nope"} 
res3: java.lang.String = nope 
0

在匹配使用unapply或unapplySeq函數時,並不像您認爲的那樣適用。