如何在模式匹配中分配变量
How to assign variable in pattern matching
我有一个方法将年份 (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
中,这将成为非常重复的代码?
模式匹配表达式的计算结果为一个值,因此它可以像任何其他表达式一样分配给 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-statements 实际上是 Scala 中的表达式,因此我们可以将它们分配给 val
s:
val x = if (true) "on" else "off"
x // x: String = on
除了 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))
}
我有一个方法将年份 (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
中,这将成为非常重复的代码?
模式匹配表达式的计算结果为一个值,因此它可以像任何其他表达式一样分配给 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-statements 实际上是 Scala 中的表达式,因此我们可以将它们分配给 val
s:
val x = if (true) "on" else "off"
x // x: String = on
除了 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))
}