2010-12-20 69 views
1

我通過奧賴利編程斯卡拉書的工作,並已運行到與此代碼示例中的絆腳石:爲什麼List(_ *)在Scala匹配表達式中無法匹配List(4,18,52)?

/* matching on sequences */ 
val willWork = List(1, 3, 23, 90); 
val willNotWork = List(4, 18, 52); 
val empty = List(); 

for(l <- List(willWork, willNotWork, empty)) 
{ 
    l match 
{ 
    case List(_, 3, _, _) => println("Four elements, with the second being '3'."); 
    case List(_*) => println("Any other list with zero or more elements"); 
    case _ => println("Uh, oh!"); 
} 
}  

根據文本,列表(_ *)應匹配任何列表中有零個或多個元素,但是當我執行此操作時,List(4,18,52)不匹配,並落入案例_部分(或者,如果刪除了,則拋出MatchError)。

任何想法,爲什麼這不匹配?自從這本書出版以來,這些語言有沒有變化?或者我剛剛有一個「你看不見自己的錯別字」的事情呢?

回答

3

您使用的是什麼版本的Scala?

在斯卡拉2.8.1.final,它會抱怨最後case是無法訪問。

scala> val willWork = List(1, 3, 23, 90); 
willWork: List[Int] = List(1, 3, 23, 90) 

scala> val willNotWork = List(4, 18, 52); 
willNotWork: List[Int] = List(4, 18, 52) 

scala> val empty = List(); 
empty: List[Nothing] = List() 

scala> 

scala> for(l <- List(willWork, willNotWork, empty)) 
    | { 
    |  l match 
    | { 
    | case List(_, 3, _, _) => println("Four elements, with the second being '3'."); 
    | case List(_*) => println("Any other list with zero or more elements"); 
    | case _ => println("Uh, oh!"); 
    | } 
    | }  
<console>:15: error: unreachable code 
     case _ => println("Uh, oh!"); 
         ^

scala> 

而且它適用於匹配空列表。

scala> val willWork = List(1, 3, 23, 90); 
willWork: List[Int] = List(1, 3, 23, 90) 

scala> val willNotWork = List(4, 18, 52); 
willNotWork: List[Int] = List(4, 18, 52) 

scala> val empty = List(); 
empty: List[Nothing] = List() 

scala> 

scala> for(l <- List(willWork, willNotWork, empty)) 
    | { 
    |  l match 
    | { 
    | case List(_, 3, _, _) => println("Four elements, with the second being '3'."); 
    | case List(_*) => println("Any other list with zero or more elements"); 
    | } 
    | } 
Four elements, with the second being '3'. 
Any other list with zero or more elements 
Any other list with zero or more elements 

scala> 
+0

我在Eclipse內部使用Scala插件運行這個東西,它似乎使用Scala 2.8.0RC3。所以這可能是問題所在。不幸的是,我沒有看到指示Scala IDE使用不同的Scala編譯器/運行庫的方法。看起來我有更多的挖掘工作要做... – mindcrime 2010-12-20 01:55:24

+0

@mindcrim:你可以看一下http://www.scala-ide.org/,看起來Scala 2.8.1有構建。 :) – 2010-12-20 02:41:41

+0

是的,我發現它......我沒有意識到我的拷貝過時了。我剛升級到最新版本,現在按預期工作。謝謝! – mindcrime 2010-12-20 03:01:56