4

mapPlay 2.0 テンプレートで2 つの連続した操作を実行したいと考えています。私はこのように試しました:

@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 に答える