为什么我的函数返回Unit而不是Int?

时间:2015-09-15 05:15:48

标签: scala return-type

我是Scala的新手,正在开展一个项目。我正在编写一个函数,假设返回数组中最小的Int。但是,当我运行它时,我得到一个类型错误,它返回单位而不是int。

这是我的代码:

def minWhile(r: Array[Int]): Int = {
  var pos = 1
  var minInt = r(0)

  while (pos < r.length) {
    if (r(pos) < minInt)
      minInt = r(pos)

    pos += 1
  }

  minInt
}

非常感谢!

3 个答案:

答案 0 :(得分:3)

您的代码编译正确,因为它始终返回正确的Int类型。但是如果我们将空数组传递给你的函数,它可能会导致一些运行时异常:minWhile(Array())。

def minWhile(r: Array[Int]): Int =
  {
    var pos = 1
    var minInt = r(0)    /* potential runtime exception */
      while( pos < r.length){
        if(r(pos) < minInt)
          minInt = r(pos)
        pos+=1

      }
    minInt
  }

您必须检查使用它的数组边界。 或者您可以使用更短的方式:

def minWhile(r: Array[Int]): Option[Int] = if (r.nonEmpty) Some(r.min) else None

答案 1 :(得分:1)

您的代码应该正确编译,但在传递空容器时可能会出现异常。您正在使用不鼓励的变量。

我会使用一些递归调用或scala集合API,如下所示:

array.reduceLeft(a: Somehitng, b: Something => Something)

检查thia链接:

http://m.alvinalexander.com/scala/scala-use-reduceleft-get-max-min-from-collection

答案 2 :(得分:0)

考虑这种传达minWhile语义的更具功能性的风格,如下所示,

def minWhile(r: Array[Int]): Int = {
  (r zip r.drop(1)).takeWhile(t => t._1 > t._2).last._2
}

我们压缩连续项目,take那些单调递减。期望的结果可以在最后一部分的第二部分找到。