Scala连续匹配

时间:2010-04-10 05:06:47

标签: 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
}

我想要连续比赛。但得到了编译错误。 :(

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

当我用parenparenthesis包装第一场比赛时,它运作正常。 为什么我需要括号?

2 个答案:

答案 0 :(得分:10)

不幸的是,这就是Scala语法的定义方式。请看一下规格:
http://www.scala-lang.org/docu/files/ScalaReference.pdf

在那里你会找到以下定义(第153页,为了清楚起见缩短了):

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

如果你深入研究PostfixExpr,你最终会找到SimpleExpr1,其中包含以下定义:

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

这意味着SimpleExpr1(以及PostfixExpr)在括在括号中时只能包含其他表达式(如'x match y')。

答案 1 :(得分:1)

不是你想要的,但你可以做这样的事情:

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)