Scala 如何理解;案例id~用户名=>_&引用;在阿诺姆?

Scala 如何理解;案例id~用户名=>_&引用;在阿诺姆?,scala,playframework-2.0,anorm,Scala,Playframework 2.0,Anorm,Play2的anorm有一个很好的DSL结果解析器: case class User(id:Pk[String], name:String) object User { val parser = get[String]("id") ~ get[String]("name") map { case id ~ name => User(id,name) } } 我不明白这部分case id~name,为什么两个变量之间会有~ 我通常认为案例: case id =>

Play2的anorm有一个很好的DSL结果解析器:

case class User(id:Pk[String], name:String)

object User {
  val parser = get[String]("id") ~ get[String]("name") map { 
    case id ~ name => User(id,name) 
  }
}
我不明白这部分
case id~name
,为什么两个变量之间会有
~

我通常认为
案例

case id => _
case (a,b) => _
case Array(a, _*) => _
但是我没有看到
案例id~name

~
的来源如下:

它定义了一个案例类
~

case class ~[+A, +B](_1:A, _2:B)
我写了一个简单的测试:

case class ~[+A, +B](_1:A, _2:B)

new ~("a","b") match {
    case x ~ y => println(x , y)
}    

它打印
a,b
,但是为什么语法是
case x~y

您已经完成了一半。这是可能的,因为Scala允许您对使用两个类型参数声明的所有类型执行此操作

例如:

scala> case class Foo[X,Y]()
defined class Foo

scala> val x: Int Foo Double = Foo[Int,Double]()
x: Foo[Int,Double] = Foo()
虽然一开始它可能看起来很奇怪,但实际上它是一个非常好的属性,因为这种语法可以使内容更具可读性。考虑下面的示例,其中定义元组的自定义类型:

class |::|[A, B](val left: A, val right: B)

object |::| {
  def unapply[A, B](o: A |::| B) = Some((o.left, o.right))
}
在这里,
A |:::| B
用作
::|[A,B]
的中缀符号。另一方面,scala还允许使用中缀符号进行模式匹配(感谢incrop的提醒),如以下示例中的构造函数:

new |::|("Hello","World") match {
  case l |::| r => Console println (l + "," + r)
  case _ =>
}  

这是中缀符号。请看:中缀类型构造函数和中缀操作模式的概念是不同的。@fotNelton,谢谢!我现在明白了。也要感谢incrop。