我想在Play 2.0模板中执行两个连续的地图操作.我试过这样的:
@defining(for(a <- as) yield { doSmthWith(a); doSmthWith2(a) })
{ aaas => aaas.map(_.toString).mkString("|") } /*CRASH*/
我认为它等同于常规Scala:
val aaas = for(a <- as) yield { doSmthWith(a); doSmthWith2(a) }
println(aaas.map(_.toString).mkString("|"))
但它在第一个崩溃那里{说预期的定义开始……
同样的事情,就像我用常规地图替换for循环:
@(as.map(a => { doSmthWith(a); doSmthWith2(a) })).map(_.toString).mkString("|"))
在第一个}符号上出现相同的崩溃.如何在Play模板中实现顺序映射?
更新:
堆栈 – 在这里! – 从控制台:
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的smth但我不在这里使用它们.必须是一些内部运作.
最佳答案 这有效:
@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
所以我的猜测是在表达式前添加@符号,并将开头大括号放在同一行,因为定义的结束paren会使它工作(假设doSmthWith2(a)实际上返回的不是单位):
@defining(for(a <- as) yield { doSmthWith(a); doSmthWith2(a) }) { aaas =>
@(aaas.map(_.toString).mkString("|"))
}