scala函数文字中的`return`

时间:2014-07-21 00:05:21

标签: function scala functional-programming return function-literal

我试图做这样的事情:

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

但是,我的IDE投诉Return statement outside method definition。那么如何在scala中的函数文字中显式地给出一个return语句呢?

4 个答案:

答案 0 :(得分:8)

在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)
}

此示例中的returngeometricAverage方法返回,如果找到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
  }
}

但这不是惯用的,而且强烈反对。

答案 1 :(得分: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

答案 2 :(得分:2)

  

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

你不能。这可以通过the language specification第6.20节返回表达式

来回答
  

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

     

由编译器生成的apply方法作为匿名函数的扩展,不计入源程序中的命名函数,并且   因此永远不会成为回归表达的目标。

答案 3 :(得分:-6)

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