[英]`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.