我正在尝试使用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 definition
上的@t._2 match {
。
我猜测问题来自于我在地图中使用元组的事实。但为什么?有没有解决方案?
答案 0 :(得分: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.
个异常。对我来说有点奇怪。我之前发现并且我已经搜索了很多内容,以确定这是当前引擎中的一个问题,您必须定义该值然后按照您想要的方式进行匹配。
干杯!