如何理解anorm中的"case id~username=>_"?
-
29-10-2019 - |
题
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
通常为:
case id => _
case (a,b) => _
case Array(a, _*) => _
但我看不出来 case id ~ name
.
的来源 ~
在这儿吗?: https://github.com/playframework/Play20/blob/master/framework/src/anorm/src/main/scala/SqlParser.scala#L49
它定义了一个case类 ~
:
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 _ =>
}
不隶属于 StackOverflow