Scala中的方法與Java中的方法相同,方法是類的壹部分。壹個方法有壹個名稱、壹個類型簽名,有時還有對該方法及其函數的註釋。
實現代碼(字節碼)。
Scala中的函數是壹個完整的對象。Scala抽象了具有22個特征的函數的概念。這22個特征的範圍從函數1到函數22。
上圖中的Function10表示具有10個形參的函數,返回值為r(協變)。
Scala中的函數實際上是繼承了這些特征的類的對象。例如,我們通過函數的文字定義函數。
事實上,上述函數的定義等價於以下定義:
因為函數2是壹個特征,所以它不能直接是新的。上面的新Function2【Int,Int,Int】(){ }實際上是壹個對象,它定義並實例化了壹個實現function 2特性的類。
Apply是scala中的壹個語法糖:在對象obj上調用obj(),scala編譯器會將其轉換為obj . apply();在類clazz()上調用clazz()Scala編譯器將轉
替換為clazz_company_obj.apply(),其中clazz_company_obj是clazz的伴生對象。
具體差異可總結如下:
1.方法不能作為單獨的表達式存在(參數為空的方法除外),但函數可以。比如:
在上面的例子中,我們首先定義了壹個方法m,然後定義了壹個函數F .然後我們使用函數名(函數值)作為最終表達式,因為F本身就是。
壹個對象(實現FunctionN特征的對象),所以這種用法是完全正確的。但是如果我們使用方法名作為最終表達式,我們會出錯。
2.函數必須有參數列表,而方法可以沒有參數列表。
在上面的示例中,m1方法接受零參數,因此可以省略參數列表。函數不能省略參數列表。
3.方法名是壹個方法術語,而函數名只代表函數對象本身。
這個比較好理解。因為保存函數的文字量(也稱為函數名或函數值)本身的變量是實現FunctionN特征的類的對象,所以有必要調用該對象的apply。
方法時,需要使用obj()的語法。因此,在函數名後面加上括號就是調用函數。如下所示:
4.在需要函數的地方,如果傳遞了壹個方法,將自動執行ETA擴展(方法將被轉換為函數)。
如果我們直接將壹個方法賦給壹個變量,我們將報告壹個錯誤。如果我們指定變量的類型是函數,我們可以編譯它,如下所示:
當然,我們也可以強制將方法轉換為函數,這使用了scala中的壹些應用程序函數:
5.傳遞name參數本質上是壹個方法。
傳遞參數本質上是壹個具有空參數列表的方法,如下所示:
上面的代碼實際上定義了壹個方法m1,m1的參數是壹個命名參數(方法)。因為對於參數為空的方法,方法名就是方法調用。
因此List(x,x)實際上進行了兩次方法調用。
因為List(x,x)進行了兩次方法調用,所以它得到了兩個不同的值。
如果我們稍微修改壹下函數m1的定義,先緩存X,結果會和之前有很大的不同。