【问题标题】:Pattern matching on object.member in Play 2.0 templatesPlay 2.0 模板中 object.member 的模式匹配
【发布时间】:2012-05-13 05:21:29
【问题描述】:

根据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)上使用此模式匹配功能是否有适当的方法?

【问题讨论】:

  • 是否匹配 @(album.year { case Some(y: Int) => { @y } case None => { nope } }) 或 @(album. year) match { case Some(y: Int) => { @y } case None => { nope } } 有效吗?
  • 不,这些都不起作用。第一个导致“预期的定义开始”,第二个导致与上述相同的“')'预期...”错误。
  • @{album.year match { case Some(y: Int) => { @y } case None => { nope } }} 有效吗?
  • 不,同样的结果(“预期的定义开始”)。
  • 感谢临时解决方法。它似乎已打补丁,但尚未发布稳定版本。

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


【解决方案1】:

你试过吗?

@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

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

【讨论】:

  • 好的,刚刚用调整后的空格试了一下。它仍然不起作用。你的例子和我的不同之处在于你的匹配表达式是一个简单的标识符(@company),而我的是@object.member。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您是否尝试过这样做?

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

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

    【讨论】:

    • 我知道这是解决我的问题中出现的简单示例的一种可能的替代方法...但是,该示例仅用于演示问题,即 Play 中的模式匹配要么不能完全工作,或未按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多