7

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

@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)的表达式上使用此模式匹配功能?

4

3 回答 3

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

在模板中执行此操作时,空格似乎非常重要

于 2012-05-15T12:20:21.467 回答
1

目前不可能(在 2.0.1 版中),因为这是一个已确认的错误:

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

于 2012-05-15T23:19:20.153 回答
0

你试过这样做吗?

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

不确定它是否像那样简单,但它应该可以工作。见https://github.com/playframework/Play20/blob/master/samples/scala/computer-database/app/views/list.scala.html#L64

于 2012-05-13T20:21:27.983 回答