Play 2.0模板中的object.member模式匹配

时间:2012-05-13 05:21:29

标签: templates scala playframework pattern-matching playframework-2.0

根据Play 2.0 documentation,模式匹配可以在模板中完成,如下所示:

@connected match {

  case models.Admin(name) => {
    <span class="admin">Connected as admin (@name)</span>
  }

  case models.User(name) => {
    <span>Connected as @name</span>
  }   
}

将case表达式后的括号之间的文本视为输出(例如HTML),这非常方便。

但是,当尝试使用不是简单变量的匹配表达式时,例如object.member,如下所示:

@album.year match {
   case Some(y: Int) => { @y }
   case None => { <b>nope</b> }
}

导致编译错误: "')' expected but 'case' found."

使用defining将表达式绑定到一个简单变量,如下所示:

@defining(album.year) { foo =>
  @foo match {
        case Some(y: Int) => { @y }
        case None => { <b>nope</b> }
      }
  }

有效,但看起来有点麻烦。

是否有正确的方法在涉及对象和成员的表达式上使用此模式匹配功能(例如album.year)?

3 个答案:

答案 0 :(得分:2)

你试过这个吗?

@album.year match {

   case Some(y: Int) => {
     @y 
   }
   case None => { 
     <b>nope</b> 
   }
}

请点击此处查看示例:https://github.com/bjartek/computer-database-mongo/blob/matchtest/app/views/list.scala.html#L67

在模板

中执行此操作时,看起来像空格是非常重要的

答案 1 :(得分:1)

目前不可能(版本2.0.1),因为它是一个确认的错误:

https://play.lighthouseapp.com/projects/82401/tickets/46-support-more-complex-match-statement

答案 2 :(得分:0)

你试过这样做吗?

@album.year.getOrElse("<b>None</b>");

不确定它是否如此简单,但它应该有效。见https://github.com/playframework/Play20/blob/master/samples/scala/computer-database/app/views/list.scala.html#L64