中的好奇模式匹配语法

时间:2015-10-29 23:19:35

标签: scala pattern-matching lift

来自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正在做什么。 有人可以解释一下吗?

2 个答案:

答案 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)

如果您通过RuleHelperliftweb框架,我们可以做一些假设。

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

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

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