-1

我试图做这样的事情:`return`在Scala的函数文本

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

然而,我的IDE投诉Return statement outside method definition。那么如何在scala中的函数文字中明确地给出return语句呢?

+0

我已经回答了一个类似的问题:http:// stackoverflow。com/a/24241486/985949 – Mik378

回答

7

在斯卡拉从封闭的方法体一return语句返回。如果return出现在函数文字中,则使用异常抛出来实现。 return会在函数内部抛出一个异常,然后被捕获的是封闭的方法。如果发现一个0

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方法返回,使其能够即刻完成:斯卡拉以这种方式工作,以使得使用该采取隐形功能,如自定义控制结构。您不需要知道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 
    } 
} 

但这不是习惯和强烈劝阻。

+0

'return'也可用于从命名函数返回。 –

-6

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

+0

该功能原理适用于函数体,根据条件/循环;例如'if(cond)valReturnedIfCond else valReturnedElse' – cchantep

+2

确实有一个return语句,它可以在命令式样式代码中用于早期退出等。它皱起了眉头。 –

+0

@DonRoby你是对的,但是当务之急Scala对我毫无兴趣 – cchantep

5

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

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

你不行。这是通过the language specification部6.20,返回表达式回答:

一个返回表达return e必须命名 方法或函数一些封闭的体内发生。

由编译器生成的作为匿名函数扩展的方法不会被视为源程序中的命名函数,因此从不是返回表达式的目标。