模式匹配不起作用

时间:2013-07-21 13:13:43

标签: scala

我想知道,为什么这不起作用:

  def example(list: List[Int]) = list match {
    case Nil => println("Nil")
    case List(x) => println(x)
  }                                             

  example(List(11, 3, -5, 5, 889, 955, 1024))

它说:

scala.MatchError: List(11, 3, -5, 5, 889, 955, 1024) (of class scala.collection.immutable.$colon$colon)

3 个答案:

答案 0 :(得分:14)

它不起作用,因为List(x)表示只包含一个元素的列表。检查一下:

def example(list: List[Int]) = list match {
  case Nil => println("Nil")
  case List(x) => println("one element: " + x)
  case xs => println("more elements: " + xs)
} 

example(List(11, 3, -5, 5, 889, 955, 1024))
//more elements: List(11, 3, -5, 5, 889, 955, 1024) 
example(List(5))
//one element: 5

答案 1 :(得分:5)

因为List(x)仅匹配具有一个元素的列表。所以

def example(list: List[Int]) = list match {
  case Nil => println("Nil")
  case List(x) => println(x)
}

仅适用于零个或一个元素的列表。

答案 2 :(得分:3)

正如其他海报所指出的那样,List(x)只匹配1个元素的列表。

但是有一些匹配多个元素的语法:

def example(list: List[Int]) = list match {
  case Nil => println("Nil")
  case List(x @ _*) => println(x)
}                                             

example(List(11, 3, -5, 5, 889, 955, 1024)) // Prints List(11, 3, -5, 5, 889, 955, 1024)

有趣的@ _*事情会产生重大影响。 _*匹配重复的参数,x @说“将此绑定到x”。

同样适用于任何可以匹配重复元素的模式匹配(例如,Array(x @ _*)Seq(x @ _*))。 List(x @ _*)也可以匹配空列表,但在这种情况下,我们已经匹配了Nil。

您还可以使用_*来匹配“其余”,如:

def example(list: List[Int]) = list match {
  case Nil => println("Nil")
  case List(x) => println(x)
  case List(x, xs @ _*) => println(x + " and then " + xs)
}