2010-04-10 9 views
7
pathTokens match { 
case List("post") => ("post", "index") 
case List("search") => ("search", "index") 
case List() => ("home", "index") 
} match { 
case (controller, action) => loadController(http, controller, action) 
case _ => null 
} 

Ich wollte zusammenhängende Übereinstimmung. aber Kompilierfehler. :(Scala zusammenhängende Übereinstimmung

(pathTokens match { 
case List("post") => ("post", "index") 
case List("search") => ("search", "index") 
case List() => ("home", "index") 
}) match { 
case (controller, action) => loadController(http, controller, action) 
case _ => null 
} 

Als ich eingewickelt ersten Spiel mit parenparenthesis, ist es ok arbeitete Warum ich Klammer hier brauchen

Antwort

10

Leider, das ist, wie die Scala Syntax definiert haben Sie einen Blick auf die Spezifikation.?.:
http://www.scala-lang.org/docu/files/ScalaReference.pdf

Dort finden Sie die folgende Definition finden (S. 153, für Klarheit verkürzt.):

 
Expr1 ::= PostfixExpr 'match' '{' CaseClauses '}' 

Wenn Sie in PostfixExpr graben werden Sie schließlich SimpleExpr1 finden, die die folgende Definition enthält:

 
SimpleExpr1 ::= '(' [Exprs [',']] ')' 
Exprs ::= Expr {',' Expr} 

Das bedeutet, dass SimpleExpr1 (und damit PostfixExpr) nur andere Ausdrücke enthalten (wie ‚x Match y‘), wenn Sie sind in Klammern eingeschlossen.

+0

Sie hilfreich Kommentar Dank. – drypot

1

Nicht das, was Sie wollen, aber Sie können Dinge tun, wie folgt:

val f1 = (_: List[String]) match { 
case List("post") => ("post", "index") 
case List("search") => ("search", "index") 
case List() => ("home", "index") 
} 

val f2 = (_: (String, String)) match { 
case (controller, action) => loadController(http, controller, action) 
} 

(f1 andThen f2)(pathTokens) 
+0

Sieht gut aus. Vielen Dank. :) – drypot

Verwandte Themen