好奇的模式匹配语法

Curious pattern matching syntax in

来自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 在做什么。 谁能解释一下?

如果您了解 liftweb 框架的 RuleHelper class,您将能够做出一些假设。

  1. XmlGetXmlDelete 使用 unapply 方法和 Request 参数扩展了 TestGet 特征。所以这部分基本上意味着:检查它是否是任何请求的 XmlGet\XmlDelete 方法。

  2. 列表和第二部分如何分离?好问题。假设 implicit listStringToSuper and listServeMagic 用于此目的。

https://github.com/lift/framework/blob/master/web/webkit/src/main/scala/net/liftweb/http/rest/RestHelper.scala

Scala 的一个很好的利基特性是可以从中缀位置 x f y 调用许多二进制操作(例如 f(x, 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.

返回值的第二部分