来自lift cookbook的示例,模式匹配在这里有点奇怪。
serve("issues" / "by-state" prefix {
case "open" :: Nil XmlGet _ => <p>None open</p>
case "closed" :: Nil XmlGet _ => <p>None closed</p>
case "closed" :: Nil XmlDelete _ => <p>All deleted</p>
})
我不明白XmlGet _ part
正在做什么。
有人可以解释一下吗?
答案 0 :(得分:4)
Scala的一个很好的利基特征是可以从中缀位置f(x, y)
调用许多二进制操作(例如x f y
)。这适用于普通方法调用:
case class InfixMethodCalls(x: Int) {
def wild(y: Int): Int = x + y
}
val infix = InfixMethodCalls(3)
infix wild 4
类型构造函数:
// A simple union type based on http://www.scalactic.org/
trait Or[A, B]
case class Good[A, B](value: A) extends Or[A, B]
case class Bad[A, B](value: B) extends Or[A, B]
def myMethod(x: Int Or String): Int
// This is the same as
def myMethod(x: Or[Int, String]): Int
和unapply
/ unapplySeq
:
object InfixMagic {
def unapply(x: Any) = Option((List(x), x))
}
123 match {
case v :: Nil InfixMagic x => println(s"got v: $v and x: $x")
}
// is the same as
123 match {
case InfixMagic(v :: Nil, x) => println(s"got v: $v and x: $x")
}
所以在of XmlGet
的情况下,这里的语法为:
case "open" :: Nil XmlGet _ =>
与:
相同case XmlGet("open" :: Nil, _) =>
而_
忽略了Req
参数,这是TestGet.unapply
返回值的第二部分。
答案 1 :(得分:1)
如果您通过RuleHelper
类liftweb
框架,我们可以做一些假设。
XmlGet
和XmlDelete
使用unapply方法和Request参数扩展TestGet
trait。所以这部分基本上意味着:检查它是否是XmlGet\XmlDelete
方法,包含任何请求。
如何将列表与第二部分分开?好问题。假设implicit
listStringToSuper and listServeMagic
用于此目的。