4

我想map在 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("|"))

但它在第{一句话就崩溃了expected start of definition......

就像我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但我在这里的任何地方都没有使用它们。一定是一些内部运作。

4

1 回答 1

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("|"))
} 
于 2012-04-22T07:00:25.313 回答