je l'ai appris Extracteurs du livre d'escalier:Comment l'extracteur fonctionne-t-il lorsque la fonction `unapply` renvoie une valeur booléenne au lieu de l'option?
object Twice {
def apply(x: Int) = x * 2
def unapply(x: Int) = if(x % 2 == 0) Some(x/2) else None
}
// outside pattern mathcing, Twice.apply(21) is called
val x = Twice(21)
x match {
// inside pattern matching, Twice.unapply(x) is called,
// the result Some(21) is matched against y,
// y gets the value 21
case Twice(y) => println(x + " is twice " + y)
case _ => println(x + " is odd.")
}
C'est assez simple. Mais aujourd'hui, j'ai lu un livre sur le cadre de lecture de ce code:
trait RequestExtractors extends AcceptExtractors {
//Convenient extractor allowing to apply two extractors.
object & {
def unapply(request: RequestHeader): Option[(RequestHeader, RequestHeader)] = Some((request, request))
}
}
//Define a set of extractors allowing to pattern match on the Accept HTTP header of a request
trait AcceptExtractors {
//Common extractors to check if a request accepts JSON, Html, etc.
object Accepts {
import play.api.http.MimeTypes
val Json = Accepting(MimeTypes.JSON)
val Html = Accepting(MimeTypes.HTML)
val Xml = Accepting(MimeTypes.XML)
val JavaScript = Accepting(MimeTypes.JAVASCRIPT)
}
}
//Convenient class to generate extractors checking if a given mime type matches the Accept header of a request.
case class Accepting(val mimeType: String) {
def unapply(request: RequestHeader): Boolean = request.accepts(mimeType)
def unapply(mediaRange: play.api.http.MediaRange): Boolean = mediaRange.accepts(mimeType)
}
def fooBar = Action {
implicit request =>
val xmlResponse: Node = <metadata>
<company>TinySensors</company>
<batch>md2907</batch>
</metadata>
val jsonResponse = Json.obj("metadata" -> Json.arr(
Json.obj("company" -> "TinySensors"),
Json.obj("batch" -> "md2907"))
)
render {
case Accepts.Xml() => Ok(xmlResponse)
case Accepts.Json() & Accepts.JavaScript() => Ok(jsonResponse)
}
}
Comment fonctionne le extracteur lorsque la fonction retourne unapply
Boolean au lieu de l'option? Comment fonctionne &
, Accepts.Xml
ici?
Les extracteurs doivent être définis dans un objet compagnon, pas la classe elle-même. – PhilBa
Pour en revenir à votre exemple Play, il semble être utilisé pour spécifier les MIME que vous voulez accepter, et comment vous voulez les gérer. – PhilBa
J'ai réécrit un peu votre exemple et l'ai posté sur github: https://gist.github.com/Phil-Ba/7725cba259973834ae70#file-extractor-scala – PhilBa