【问题标题】:Play 2 Anorm and scala pattern matching玩 2 Anorm 和 scala 模式匹配
【发布时间】:2013-04-01 18:11:09
【问题描述】:

我在使用 anorm 从 play2 模块查询 mysql 数据库时尝试使用模式匹配。代码如下所示:

def test= Action {
    DB.withConnection { implicit c =>
    val entities = SQL("SELECT entity.idEntity, entity.name FROM entity")().collect {
        case Row(id:Int, name:String) => Entity(id, name)
  }
  printList(entities.toList)

}

但是 name:String 不匹配任何东西(已经尝试只匹配整数并且它工作正常)。在我的数据库中,实体表“名称”列类型是 varchar(45)。

我缺少什么?

【问题讨论】:

  • 尝试使用 'name: Option[String]',因为该列可以为空。
  • Option[String] 甚至 Some[String] 出现同样的错误
  • 您提到了一个错误。这是什么错误?
  • 没有错误...如果我把 String 类型放在那里,它就是不匹配任何东西。

标签: scala playframework-2.0 anorm


【解决方案1】:

您可以尝试在 Int 和命名通配符上匹配 Row

scala> new Row(0,"foo")
res0: Row = Row(0,foo)


scala> res0 match{
     | case Row(i: Int,s @ _) => println(i + " " + s)
     | }
0 foo

【讨论】:

  • 是的,我可以这样做...但是类型模式匹配的想法不是能够避免转换模式匹配的结果吗?
【解决方案2】:

如果名称可以为空,那么这种匹配应该有效:

case Row(id:Int, Some(name:String)) 

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 2013-07-26
    • 2016-05-17
    • 2021-12-17
    • 2017-02-25
    • 2015-01-17
    • 2011-02-06
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多