-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必須命名 方法或函數一些封閉的體內發生。

由編譯器生成的作爲匿名函數擴展的方法不會被視爲源程序中的命名函數,因此從不是返回表達式的目標。