如何在模式匹配中分配变量

时间:2019-06-16 13:11:32

标签: scala pattern-matching immutability

我有一个采用年份(int)作为参数的方法。根据过去的年份,我需要分配一个变量,然后在查询中使用该变量:

def findByYear (year: Int): Future[Int] = {
  val tableName = ""
  year match {
    case 1970 => tableName = "table1970" //this errors out
    case 1980 => tableName = "table1980" //this errors out
  }
  config.db.run {
    sqlu"SELECT count(*) from #${tableName}"
  }
}

由于scala不允许重新分配,因此出现了以上错误。有没有更好的方法来代替将config.db.run子句放在每个case中,而这会变成非常重复的代码?

2 个答案:

答案 0 :(得分:6)

模式匹配表达式的计算结果为一个值,因此可以像其他任何表达式一样将其分配给val

    def findByYear (year: Int): Future[Int] = {
      val tableName = year match {
        case 1970 => "table1970"
        case 1980 => "table1980"
      }
      config.db.run {
        sqlu"SELECT count(*) from #${tableName}"
      }
    }

即使if语句实际上是Scala中的表达式,我们也可以将它们分配给val

val x = if (true) "on" else "off"
x // x: String = on

答案 1 :(得分:0)

除了来自Mario的好答案之外,我还要在模式匹配中添加其他大小写,以处理错误的输入:

def findByYear (year: Int): Future[Option[Int]] = {
  val tableName: Option[String] = year match {
    case 1970 => Some("table1970")
    case 1980 => Some("table1980")
    case _    => None
  }
  tableName.map { name =>
    config.db.run {
      sqlu"SELECT count(*) from #${name}"
    }
  }.getOrElse(Future.successful(None))
}