2012-04-21 34 views
4

我想在Play 2.0模板中執行兩個連續的map操作。我曾嘗試這樣的:播放2.0 - 映射到模板上的'map'或'for-yield'結果

@defining(for(a <- as) yield { doSmthWith(a); doSmthWith2(a) }) 
    { aaas => aaas.map(_.toString).mkString("|") } /*CRASH*/ 

,我冒昧地等同於常規的斯卡拉:

val aaas = for(a <- as) yield { doSmthWith(a); doSmthWith2(a) } 
println(aaas.map(_.toString).mkString("|")) 

但第一{expected start of definition崩潰那裏......

同樣的事情,如果我用常規地圖替換for循環:

@(as.map(a => { doSmthWith(a); doSmthWith2(a) })).map(_.toString).mkString("|")) 

與第一個}標誌上的相同碰撞。我如何在Play模板中實現序列映射?

UPDATE:

堆棧 - 在這裏它是! - 直接從控制檯:

sbt.PlayExceptions$CompilationException: Compilation error [expected start of de 
finition] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$2$$anonfun$apply$ 
11$$anonfun$apply$12.apply(PlayReloader.scala:224) ~[na:na] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$2$$anonfun$apply$ 
11$$anonfun$apply$12.apply(PlayReloader.scala:224) ~[na:na] 
     at scala.Option.map(Option.scala:133) ~[scala-library.jar:0.11.2] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$2$$anonfun$apply$ 
11.apply(PlayReloader.scala:224) ~[na:na] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$3$$anonfun$2$$anonfun$apply$ 
11.apply(PlayReloader.scala:221) ~[na:na] 
     at scala.Option.map(Option.scala:133) ~[scala-library.jar:0.11.2] 

堆棧表示不便約Option但我不隨地這裏使用它們。必須是一些內部工作。

+0

請發佈錯誤信息。 – paradigmatic 2012-04-21 09:33:31

回答

2

這工作:

@defining(for (a <- List(1,2,3)) yield { 
    play.api.Logger.debug("a:" + a) 
    a*3 
}) { as => 
    @(as.mkString("|")) 
} 

哪個頁面,並打印在控制檯中顯示3|6|9

[debug] application - a:1 
[debug] application - a:2 
[debug] application - a:3 

所以我的猜測是增加在表達前面的@標誌以及把在與定義的關閉同一行的同一行上的開啓支架將使其工作(假設doSmthWith2(a)實際上返回的是除了單位之外的東西):

@defining(for(a <- as) yield { doSmthWith(a); doSmthWith2(a) }) { aaas => 
    @(aaas.map(_.toString).mkString("|")) 
}