2010-04-10 12 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 
} 

Yo quería una coincidencia contigua. pero obtuve el error de compilación. :(Conversión contigua Scala

(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 
} 

Cuando me envolví primer partido con parenparenthesis, funcionó bien Por qué necesito paréntesis aquí

Respuesta

10

Por desgracia, así es como se define la sintaxis Scala favor, eche un vistazo a las especificaciones.?.:
http://www.scala-lang.org/docu/files/ScalaReference.pdf

Allí encontrará la siguiente definición (p 153, acortada para mayor claridad.):

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

Si se mira en PostfixExpr es muy probable que encontrar SimpleExpr1 que contiene la siguiente definición:

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

Eso significa que SimpleExpr1 (y por lo tanto PostfixExpr) sólo puede contener otras expresiones (como 'x partido y') cuando están envueltos entre paréntesis.

+0

Gracias por comentario útil. – drypot

1

No es lo que quieren, pero se puede hacer cosas como esta:

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

Se ve bien. Gracias. :) – drypot

Cuestiones relacionadas