2

Scala Play フレームワーク 2 を使用して、テンプレート内の複雑な値を反復処理しようとしています。

私の変数は次のとおりです。tests: List[(String,Option[List[String]])]

私は次のように繰り返します:

@if(!tests.isEmpty) {
<h3>Tests results</h3>
@tests.map(t => {

<h4>@t._1</h4>

@t._2 match {
case None => {
<p>
  <span>
    [WARNING] Test failed
  </span>
</p>
}
case Some(res) {
@res.map(r => {
<p>
  <span>
    @r
  </span>
</p>
})}
}

})}

しかし、次のエラーが発生しました: expected start of definitionon @t._2 match {

この問題は、マップ内でタプルを使用していることが原因であると推測しました。しかし、なぜ?解決策はありますか?

4

1 に答える 1

2

問題は、中括弧と括弧を使用する方法にありますmap。括弧内のすべてがscalaコードとして扱われます。htmlを使用したり、@期待どおりに使用したりすることはできません。中括弧の内側では、好きな@ように使用できます。

たとえば、これはコンパイルされず、:が発生しexpected start of definitionます

@(tests: List[(String,Option[List[String]])])

<h3>Tests results</h3>

@tests.map( t => {  
  <h4>@t._1</h4>
  @t._2
})

一方、これはコンパイルされ、想定どおりに機能します。

@(tests: List[(String,Option[List[String]])])

<h3>Tests results</h3>

@tests.map{ t =>   
  <h4>@t._1</h4>
  @t._2
}

テンプレートがscalaコードを解析する方法に問題がありました。彼らがそれをscalaコンパイラがscalaコードを解析する方法で解析するかどうかは完全にはわかりません。以前に読んだことがありますが、いくつかの制限があります。そして、私はあなたに少しずつお見せします。中括弧を切り替えると、ソリューションがコンパイルされ、正常に機能します。そして、あなたはそのようなものになってしまうでしょう:

@(tests: List[(String,Option[List[String]])])

<h3>Tests results</h3>

@tests.map{  t =>  
<h4>@t._1</h4>

@defining(t._2) { optLst => 
  @optLst match {
    case None => {
        <p>
          <span>
            [WARNING] Test failed
          </span>
        </p>
    }
    case Some(res) => {
        @res.map{r => 
        <p>
          <span>
            @r
          </span>
        </p>
        }
    }
  }
}

}

これは、それを行うための最も慣用的な方法ではありません。私はおそらくそこでパターンマッチングの代わりに地図を使うでしょう。しかし、あなたに合ったものを使用してください。ここでのポイントは@definingそこにあるということです。気づきましたか?t._2と直接一致させようとすると、')' expected but 'case' found.例外が発生します。私にとって奇妙なことは何ですか。そして、私は以前にそれを見つけました、そして私はこれが現在のエンジンの問題であり、あなたが値を定義しそしてそれをあなたが望むように一致させなければならないことを見つけるためにそれをたくさんグーグルで調べました。

乾杯!

于 2012-12-20T15:23:06.120 に答える