繁体   English   中英

在scala函数文字中`return`

[英]`return` in a scala function literal

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

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

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

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

但这不是惯用法,不建议这样做。

不要使用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

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

你不能 语言规范第6.20节“ 返回表达式”将回答此问题:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM