One*_*ero 1 functional-programming scala return function function-literal
我正在尝试做这样的事情:
var fun : (Int,Int) => Double = (a,b) =>
{
// do something
return 1.0
}
Run Code Online (Sandbox Code Playgroud)
但是,我的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)
}
Run Code Online (Sandbox Code Playgroud)
在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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您真的想return在函数的定义中使用,可以手动实现相应的函数接口,而不是使用函数文字:
val fun = new Function2[Int, Int, Double] {
def apply(x: Int, y: Int): Double = {
if (x == y)
return 0.0
1.0
}
}
Run Code Online (Sandbox Code Playgroud)
但这不是惯用语,而是强烈劝阻.
不要使用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
Run Code Online (Sandbox Code Playgroud)
或者更好的是:
scala> def fun: (Int, Int) => Double = (a, b) => {
| // do something
| 1.0
| }
fun: (Int, Int) => Double
scala> fun(1, 2)
res4: Double = 1.0
Run Code Online (Sandbox Code Playgroud)