Scala模式匹配混淆

Pie*_*rew 3 scala

我开始学习Scala,我不太了解模式匹配的一些行为.任何人都可以向我解释为什么第一种情况有效但第二种情况不起作用?

1

def getFirstElement(list: List[Int]) : Int = list match {
    case h::tail => h
    case _ => -1
}

Scala> getFirstElement(List(1,2,3,4))
res: Int = 1

Scala> 1 :: List(1,2)
res: List[Int] = List(1, 1, 2)
Run Code Online (Sandbox Code Playgroud)

2

def getSumofFirstTwoElement(list: List[Int]): Int = list match {
    case List(a: Int, b: Int)++tail => a + b
    case _ => -1
}

<console>:11: error: not found: value ++

Scala> List(1,2) ++ List(3,4,5)
res: List[Int] = List(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

Jus*_*ony 6

原因是unapply类型对象上没有方法++.有效的原因::是因为幕后真的是:

final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
  override def tail : List[B] = tl
  override def isEmpty: Boolean = false
}
Run Code Online (Sandbox Code Playgroud)

资源

这导致了如何在Scala中实现模式匹配.它使用提取器(或此处),它们基本上是包含unapply方法的对象,默认情况下提供了case类.

  • 此外,应该注意这是作为hd :: tl工作,因为它以:结尾,表示它可以以这种正确的关联方式使用.我开始想出一种让你的++工作的方法,但它不会很漂亮 (2认同)