2015-10-29 2 views
2

Пример от 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

это какая-то частичная функция. Я бы предложил получить класс RuleHelper и искать скрытые импликации. – Rumoku

+0

ответил в громадной комнате. Это тот же синтаксис, что и '_ :: Nil'. –

ответ

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

Если вы пройдете через RuleHelper класс liftweb рамки, вы сможете сделать несколько предположений.

  1. XmlGet и XmlDelete расширяет TestGet черты с методом и исключить его запрос аргументом. Таким образом, эта часть в основном означает: проверьте, есть ли метод XmlGet\XmlDelete с любым запросом.

  2. Как список отделен от второй части? Хороший вопрос. Предположим, что для этой цели используется implicitlistStringToSuper and listServeMagic.

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

Смежные вопросы