【问题标题】:Play 2.0 templating - Scala `match` and `val` do not compile in a view templatePlay 2.0 模板 - Scala `match` 和 `val` 不在视图模板中编译
【发布时间】:2012-04-07 17:06:07
【问题描述】:

我在 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 赋值?

【问题讨论】:

    标签: scala pattern-matching template-engine playframework-2.0


    【解决方案1】:

    在模板中使用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 =&gt; Html) 帮助器定义值:

    @defining(1 + 2 * 3) { value =>
      <div>@value</div>
    }
    

    【讨论】:

      【解决方案2】:

      我发现在外面添加一个 {} 来包含整个代码会起作用

      @{content.toString.lines.map{ line => 
        line match {
          case "" =>  @Html("")
          case _ => <li>@Html(line)</li> 
      }}  
      

      【讨论】:

      • 救命稻草!在这个问题上挠了一个多小时后,我发现这对我也有用。完全出乎意料,因为我在同一个项目中有其他文件,结构几乎相同,不需要这个,唯一可能的区别是我使用的是传递参数的字段而不是传递的参数(@x.f 与@x)但是我编辑了代码并尝试直接传递参数,但它仍然无法编译。我虽然可能是 .xml 与 .html,但也没有什么区别。感谢您的回答!
      • 在一个非常奇怪的情况下,我突然开始编译的任何东西 - 使用(奇迹疗法)包裹的大括号是错误的,然后当我删除它们时,新的错误消失了,但是整个文件编译干净。我迅速尝试撤销我在过去几个小时左右所做的所有更改,看看我是否可以在这里找到真正的罪魁祸首,但无济于事。如果这种情况发生在您身上,我建议您深入挖掘,因为大括号以某种方式掩盖了更深层次的问题。
      【解决方案3】:

      以下似乎对我有用

      @content.toString.lines.map{ line => 
          line match {
            case "" =>  @Html("")
           case _ => <li>@Html(line)</li> 
      }  
      

      眼睛很难看,但您可以查看 play 项目目录中的 target/scala-2.9.1/src_managed/main/views/html/index.template.scala 以了解它在字符串文字中的内容。

      至于 val 赋值,我不知道,但@defining 可能会有所帮助

      【讨论】:

        【解决方案4】:

        另一个导致此错误的常见原因是将起始大括号放在单独的行上:

        @x match {
        case y => 
          { //offending brace, put it back on the same line as case
          } //This can go anywhere
        }
        

        【讨论】:

          猜你喜欢
          • 2014-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          相关资源
          最近更新 更多