當前位置:成語大全網 - 書法字典 - scala中方法和函數的區別

scala中方法和函數的區別

Scala中既有函數也有方法,大多數情況下我們可以忽略它們之間的差異。但有時我們必須了解它們之間的差異。

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,結果會和之前有很大的不同。