4

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

  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)
4

3 回答 3

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
于 2013-07-21T13:25:31.200 回答
5

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

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

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

于 2013-07-21T13:25:17.310 回答
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)
}
于 2013-07-22T12:20:56.090 回答