Scala模式匹配引用匹配值中的混淆

Scala模式匹配引用匹配值中的混淆,scala,pattern-matching,Scala,Pattern Matching,当我在上面一行运行时,结果是“列表(1,2,3)”。 所以我的问题是在“println(tail)”语句中tail函数调用指的是什么?显然,它不是匹配的值,因为“a.tail”调用会给出另一个结果 如果这个tail调用引用了match语句的“list”,那么结果不应该是“list(1,2,3,4)”这里,tail不是一个函数,它是一个本地值,在matched模式中定义。您可以这样重写您的示例: def listMatch(list:List[Int]): Unit = list match {

当我在上面一行运行时,结果是“列表(1,2,3)”。 所以我的问题是在“println(tail)”语句中tail函数调用指的是什么?显然,它不是匹配的值,因为“a.tail”调用会给出另一个结果
如果这个tail调用引用了match语句的“list”,那么结果不应该是“list(1,2,3,4)”

这里,tail不是一个函数,它是一个本地值,在matched模式中定义。您可以这样重写您的示例:

def listMatch(list:List[Int]): Unit = list match {
  case a @ ((31 :: tail) :+ 4) => println(tail)
}

listMatch(List(31,1,2,3,4))

问题中的
尾部
是取消应用
头部
31
和最后一个元素
4
后列表的剩余部分。这给我们留下了一个
列表(1,2,3)
,这就是您看到的结果。与值
tail
的绑定发生在模式匹配内部

我们可以在列表分配本身上进行模式匹配,以便提取出不同的部分:

    def listMatch(list:List[Int]): Unit = list match {
    case a @ ((31 :: shadok) :+ 4) => println(shadok)
    }                                 //> listMatch: (list: List[Int])Unit

    listMatch(List(31,1,2,3,4))       //> List(1, 2, 3)
如果我们从unapply中删除
+:
,我们将得到与
list.tail
相同的
tail
调用,其计算结果为
list(1,2,3,4)

scala> val list = List(31,1,2,3,4)
list: List[Int] = List(31, 1, 2, 3, 4)

scala> val ((head :: tail) :+ 4) = list
head: Int = 31
tail: List[Int] = List(1, 2, 3)