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

Tôi muốn trận đấu tiếp giáp. nhưng có lỗi biên dịch. :(Scala contiguous match

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

Khi tôi quấn trận đấu đầu tiên với parenparenthesis, nó làm việc ok Tại sao tôi cần ngoặc ở đây

Trả lời

10

Thật không may, đó là cách cú pháp Scala được định nghĩa hãy có một cái nhìn tại các đặc điểm kỹ thuật.?.:
http://www.scala-lang.org/docu/files/ScalaReference.pdf

Ở đó bạn sẽ tìm ra định nghĩa sau đây (p 153, rút ​​ngắn cho rõ ràng.):

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

Nếu bạn thâm nhập vào PostfixExpr bạn cuối cùng sẽ tìm SimpleExpr1 chứa các định nghĩa sau đây:

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

Điều đó có nghĩa rằng SimpleExpr1 (và do đó PostfixExpr) chỉ có thể chứa các biểu thức khác (như 'x trận đấu y') khi chúng được bọc trong ngoặc đơn.

+0

Cảm ơn bạn đã bình luận hữu ích. – drypot

1

Không phải những gì bạn muốn, nhưng bạn có thể làm những thứ như thế này:

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

Có vẻ tốt. Cảm ơn bạn. :) – drypot