在案例陈述中无法应用的对象

ptr*_*zlo 5 scala

scala> object Test {
         def unapply[L,R](v: (L, R)) = Some(v)
       }
defined object Test

scala> (1, 2) match {
         case 1 Test 2 => println("First")
         case Test((1, 2)) => println("Second")
         case _ => println("Third")
       }
First
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么第一种情况对元组的两个值之间的对象起作用吗?

Mar*_*rth 5

Scala规范8.1.10开始

中缀操作模式
缀操作模式 p;op;q是构造函数或提取模式的简写op(p,q)

所以

case 1 Test 2 => println("First")
Run Code Online (Sandbox Code Playgroud)

被重写为

case Test(1, 2) => println("First")
Run Code Online (Sandbox Code Playgroud)

您实际上可以在REPL中看到这一点,方法是//print在行的末尾添加并按<tab>两次:

scala> (1, 2) match { case 1 Test 2 => println("First") } //print
   scala.Tuple2.apply[Int, Int](1, 2) match {
     case $line10.$read.$iw.$iw.Test(1, 2) => scala.Predef.println("First")
   } // : Unit
Run Code Online (Sandbox Code Playgroud)