2013-02-28 108 views
2

我是一個scala新手。斯卡拉匿名函數語法

是什麼

invokeFunc(() => { "this is a string" }) 

invokeFunc({() => "this is a string" }) 

如果你有一個小的細微差別階我將不勝感激一個很好的資源之間的差異。

+4

我會說stackoverflow [是這樣的資源(向下滾動)](http:// stackoverflow。com/tags/scala/info) – 2013-02-28 10:47:44

+0

哇謝謝,不知道它存在:) – 2013-02-28 10:48:42

回答

10

TL; DR:這兩個代碼片段是等效的。

() => { "this is a string" }大括號引入代碼。由於這段代碼只包含一個表達式,所以它本質上是無用的,你可以寫成() => "this is a string"

此外,scala幾乎總是讓您選擇是否在調用方法時使用括號或大括號。所以println("hello")println{"hello"}相同。 scala允許使用大括號的原因是,您可以定義可以使用的方法,例如它是該語言的內置部分。舉例,你可以定義:

def fromOneToTen(f: Int => Unit) { 
    for (i <- 1 to 10) f(i) 
} 

然後執行:

fromOneToTen{ i => println(i) } 

的花括號這裏使它看起來更像是一個控制結構,如Scala的內置while

所以invokeFunc(() => { "this is a string" })相同invokeFunc{() => { "this is a string" } }

作爲最後一點,括號總是可以在任何地方圍繞單個表達式中使用,所以(5)是一樣的5。 花括號始終可用於定義包含一系列表達式的塊,該塊返回最後一個表達式。這種情況的一個特例是單個表達式的塊,在這種情況下,大括號與括號發揮相同的作用。 所有這一切意味着您可以隨時在表達式中添加多餘的圓括號或大括號。所以以下全部等同:123,{123},(123),({123})等等。

這也意味着:

invokeFunc(() => "this is a string") 

相同

invokeFunc({() => "this is a string" }) 

其是相同

invokeFunc({(() => "this is a string")}) 

等。

6

據我瞭解,第一個有一個匿名函數,而第二個有一個塊。但是,塊的最後一個元素在Scala中返回,所以塊返回相同的匿名函數,然後該函數成爲方法的參數。

+3

TLDR:在這種情況下根本沒有任何區別 – 2013-02-28 11:03:37

+2

在這種情況下。但'invokeFunc({println(「heeeey!」);()=>「這是一個字符串」})'也行得通,證明了它的區別。 – pr1001 2013-02-28 11:07:54