我在Play 2.0模板中有以下代码:
@content.toString.lines.map{
case line => // i put `case` here as another attempt to make it work
line match {
case "" => @Html("")
case _ => <li>@Html(line)</li> /*CRASH*/
}
}
它在标记的行上失败,说not found: value line
。它的第二个变种:
@for(line <- content.toString.lines){
@line match { /*CRASH*/
case "" => @Html("")
case _ => <li>@Html(line)</li>
}
}
在标记的行上失败,声称'case' expected but identifier found
。
更新
同样适用于val
:
@val headID = "head"
提出了illegal start of simple expression
。
更新结束
我想知道,我做错了什么以及如何在Play的模板中正确实现match-case
结构和val
作业?
答案 0 :(得分:25)
match
表达式您需要在大括号(“{”和“}”)中附上模板的HTML内容:
@for(line <- content.toString.lines) {
@line match {
case "" => { }
case _ => { <li>@Html(line)</li> }
}
}
在您的具体情况下,以下代码将更好地阅读恕我直言:
@content.toString.lines.collect {
case line if !line.isEmpty => { <li>@Html(line)</li> }
}
您可以使用defining[T](value: T)(usage: T => Html)
帮助程序定义值:
@defining(1 + 2 * 3) { value =>
<div>@value</div>
}
答案 1 :(得分:4)
我发现在外面添加一个{}可以包含整个代码
@{content.toString.lines.map{ line =>
line match {
case "" => @Html("")
case _ => <li>@Html(line)</li>
}}
答案 2 :(得分:1)
以下似乎对我有用
@content.toString.lines.map{ line =>
line match {
case "" => @Html("")
case _ => <li>@Html(line)</li>
}
很难看,但你可以在播放项目目录中查看target/scala-2.9.1/src_managed/main/views/html/index.template.scala
,看看它在字符串文字中的含义。
关于val赋值,我不知道,但@defining可能有帮助
答案 3 :(得分:0)
此错误的另一个常见原因是将起始括号放在一个单独的行上:
@x match {
case y =>
{ //offending brace, put it back on the same line as case
} //This can go anywhere
}