如何使用scala初始化不可变的val而不创建另一个val

时间:2012-05-10 05:27:46

标签: scala

我有以下代码:

private def formatQuery(q:String = ""):String = {
  val q2 = if (q=="") "*" else "'%s'".format(q)
  [...]

我想知道是否有一些惯用的方法来避免声明q2值

喜欢

private def formatQuery(
  q:String = if (q=="") "*" else "'%s'".format(q)
):String = {
  [...]

显然不起作用

3 个答案:

答案 0 :(得分:4)

您是否有特殊原因试图避免分配给变量q2?风格本身似乎很好。

你提出的建议显然不起作用,但这里有两个可行的建议。

如果您的原始功能是:

private def formatQuery(q:String = ""):String = {
  val q2 = if (q=="") "*" else "'%s'".format(q)
  doSomething(q2)
}

一种选择是只传递if-else表达式,然后传递q2

private def formatQuery(q:String = ""):String =
  doSomething(if (q=="") "*" else "'%s'".format(q))

另一个是制作一个单独的功能:

private def formatQuery(q:String = ""):String =
  runQuery(if (q=="") "*" else "'%s'".format(q))

private def runQuery(q2:String):String =
  doSomething(q2)

答案 1 :(得分:2)

第三种方式是模式匹配。

private def formatQuery(q: String = ""): String = q match {
  case _ if q.length == 0 => "*"
  case _ => "'%s'".format(q)
}

我更喜欢你这样做的方式,首先是因为它风格很好。

答案 2 :(得分:1)

可能存在一个误解:方法体内的 val 不是封闭类或特征或......的字段,但它只是一个局部变量。因此关键字 val 用于创建字段以创建局部变量。