首页 > 解决方案 > Scala未使用的表达式错误与if语句

问题描述

我对 Scala 很陌生,并尝试编写一个简单的 Scala 程序来获得最大值。我发现了一些奇怪的东西(可能是特定于语言的功能)。这里是:

  def max(xs: List[Int]): Int = {
    if (xs.isEmpty) {
      throw new java.util.NoSuchElementException
    }

    def maxAux(x: List[Int], curMax: Int): Int = {
      if (x.isEmpty)  {
        curMax
      }
      if (x.head > curMax) {
        maxAux(x.tail, x.head)
      }
      else {
        maxAux(x.tail, curMax)
      }
    }
    maxAux(xs.tail, xs.head)
  }
}

出于某种原因,在maxAux函数内部,第一条if语句的返回给了我一个 IntelliJ 警告,它是一个“未使用的表达式”。事实证明这是正确的,因为那条线似乎没有返回。为了解决这个问题,maxAuxI 中的第二个 if 语句更改为else if,然后一切都按预期工作。另一个解决方法是在return之前添加一个语句curMax,但显然使用return是不好的风格/做法。

TL;DR:谁能解释为什么上面的代码curMax没有返回?

标签: scala

解决方案


直接的问题是 Scala 返回块中最后一个表达式的值,即第二个if/else表达式。所以第一个的值if只是被丢弃了。这可以通过将第二个设置if为 an来解决,使其else if成为单个表达式。

更好的解决方案是使用match,这是取消选择 a 的标准方法List

def maxAux(x: List[Int], curMax: Int): Int =
  x match {
    case Nil =>
      curMax
    case max :: tail if max > curMax =>
      maxAux(tail, max)
    case _ :: tail =>
      maxAux(tail, curMax)
  }

推荐阅读