Как назначить переменную в сопоставлении с образцом - PullRequest
0 голосов
/ 16 июня 2019

У меня есть метод, который принимает год (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 ]

6 голосов
/ 16 июня 2019

Выражение соответствия шаблону оценивается как значение, так что оно может быть присвоено 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 s:

val x = if (true) "on" else "off"
x // x: String = on
0 голосов
/ 16 июня 2019

В дополнение к отличному ответу от Марио, я хотел бы добавить дополнительный случай в сопоставление с образцом, который обрабатывает неправильный ввод:

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))
}

...