好奇的模式匹配语法
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,您将能够做出一些假设。
XmlGet
和 XmlDelete
使用 unapply 方法和 Request 参数扩展了 TestGet
特征。所以这部分基本上意味着:检查它是否是任何请求的 XmlGet\XmlDelete
方法。
列表和第二部分如何分离?好问题。假设 implicit
listStringToSuper and listServeMagic
用于此目的。
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
.
返回值的第二部分
来自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,您将能够做出一些假设。
XmlGet
和XmlDelete
使用 unapply 方法和 Request 参数扩展了TestGet
特征。所以这部分基本上意味着:检查它是否是任何请求的XmlGet\XmlDelete
方法。列表和第二部分如何分离?好问题。假设
implicit
listStringToSuper and listServeMagic
用于此目的。
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
.