1

我正在尝试做这样的事情:

var fun : (Int,Int) => Double = (a,b) =>
{
  // do something
  return 1.0
}

但是,我的 IDE 对Return statement outside method definition. 那么如何在scala的函数文字中明确给出return语句?

4

4 回答 4

10

在 Scala 中,一条return语句从封闭的方法体返回。如果return出现在函数字面量中,则通过异常抛出实现。return将在函数内部抛出异常,然后将其捕获为封闭方法。Scala 以这种方式工作是为了使用使函数不可见的自定义控件构造,例如:

def geometricAverage(l: List[Double]): Double = {
  val product = l.foldLeft(1.0) { (z, x) =>
    if (x == 0) return 0 else z * x
  }
  Math.pow(product, 1.0 / l.length)
}

return这个例子中,从该geometricAverage方法返回,如果找到 0 则允许它立即完成。您不需要知道这foldLeft是一种采用函数而不是内置构造来实现这一点的方法。

Scala 中的偏好是以函数式风格编写函数,利用 Scala 面向表达式的特性使其变得return不必要。例如:

val fun: (Int,Int) => Double = (a,b) => {
  if (a == b) {
    // side effect here, if desired
    0.0
  } else {
    // side effect here, if desired
    1.0
  }
}

如果你真的想return在函数的定义中使用,你可以手动实现相应的函数接口,而不是使用函数字面量:

val fun = new Function2[Int, Int, Double] {
  def apply(x: Int, y: Int): Double = {
    if (x == y)
      return 0.0
    1.0
  }
}

但这不是惯用的,强烈建议不要这样做。

于 2014-07-21T00:33:06.833 回答
6

不要使用 return,它会让 Scala 哭泣。

scala> var fun: (Int, Int) => Double = (a, b) => {
     | // do something
     | 1.0
     | }
fun: (Int, Int) => Double = <function2>

scala> fun(1, 2)
res4: Double = 1.0

或者更好:

scala> def fun: (Int, Int) => Double = (a, b) => {
     | // do something
     | 1.0
     | }
fun: (Int, Int) => Double

scala> fun(1, 2)
res4: Double = 1.0
于 2014-07-21T00:28:19.677 回答
2

如何在scala的函数文字中明确给出return语句?

你不能。语言规范第 6.20 节,返回表达式回答了这个问题:

返回表达式return e必须出现在一些封闭的命名方法或函数的主体内。

编译器生成的作为匿名函数扩展的apply方法在源程序中不算作命名函数,因此绝不是返回表达式的目标。

于 2014-07-21T00:59:09.653 回答
-8

Scala中没有return声明。在任何函数中,最后执行的语句都是返回的值。如果最后一条语句不符合函数的预期返回类型,编译器将引发错误。

于 2014-07-21T00:10:05.670 回答