Scala 傻傻分不清的方法和函式

2021-10-05 14:51:52 字數 2046 閱讀 7769

感性的認識一下方法和函式

方法m 是乙個邏輯操作快;

函式f 是物件,可以賦值給乙個變數或常量;

函式f 有乙個=>轉換符號;

object methodandfunctiondemo 

//定義乙個函式f1,引數是兩個int型別,返回值是乙個int型別

val f1 =

(x:int,y:int)

=> x + y

//再定義乙個函式f2

val f2 =

(m:int,n:int)

=> m * n

//main方法

def main

(args: array[string]

): unit =

}

執行結果:

8

12

帶引數列表的方法m 不能作為單獨的表示式而存在,引數為空的除外;

函式f 可以;

有兩種方法可以將方法轉換成函式:

val f1 = m _
在方法名稱m後面緊跟乙個空格和下劃線告訴編譯器將方法m轉換成函式,而不是要呼叫這個方法。 也可以顯示地告訴編譯器需要將方法轉換成函式:

val f1: (int) => int = m
通常情況下編譯器會自動將方法轉換成函式,例如在乙個應該傳入函式引數的地方傳入了乙個方法,編譯器會自動將傳入的方法轉換成函式。

object testmap 

val f0 =

(x : int)

=> x * x

//定義了乙個方法

def m0

(x:int)

: int =

//將方法轉換成函式,利用了神奇的下滑線

val f1 = m0 _

def main

(args: array[string]

): unit =

}

輸出結果為:

100

100100

100

方法m 可以沒有引數列表;

函式f 必須有;

在需要函式的地方或者說指定型別為函式的地方,傳入乙個方法m,會自動轉成函式f;

例如:把乙個方法賦值給乙個變數或常量,如果沒有指定變數的型別是函式,則會報錯,所以需要指定變數型別為函式才會自動轉換方法為函式;或者過m _強制轉換方法為函式。

在需要函式的地方,如果傳遞乙個方法,會自動進行eta展開(把方法轉換為函式)

如果我們直接把乙個方法賦值給變數會報錯。如果我們指定變數的型別就是函式,那麼就可以通過編譯,如下:

當然我們也可以強制把乙個方法轉換給函式,這就用到了 scala 中的部分應用函式:

上圖方法m1的引數就是傳名引數(方法),由於對於引數為空的方法來說,方法名就是方法呼叫,那麼list(x,x)就是是進行了兩次方法x呼叫。

方法是乙個以def開頭的帶有引數列表(可以無引數列表)的乙個邏輯操作塊,這正如object或者class中的成員方法一樣。

函式是乙個賦值給乙個變數(或者常量)的匿名方法(帶或者不帶引數列表),並且通過=>轉換符號帶上邏輯**塊的乙個表示式。=>轉換符號後面的邏輯**塊的寫法與method的body部分相同。

參考:

scala 方法和函式的區別

scala method(方法) 和 functio(函式) 的區別

這幾個的用法傻傻分不清

每每看到這幾個,就矇圈了,這都是啥呀?既然這麼容易混淆,我還是來做個小筆記吧,以便日後查閱 1.slice 陣列 用法 array.slice start,end 解釋 該方法是對陣列進行部分擷取,並返回乙個陣列副本 引數start是擷取的開始陣列索引,end引數等於你要取的最後乙個字元的位置值加上...

這幾個的用法傻傻分不清

每每看到這幾個,就矇圈了,這都是啥呀?既然這麼容易混淆,我還是來做個小筆記吧,以便日後查閱 1.slice 陣列 用法 array.slice start,end 解釋 該方法是對陣列進行部分擷取,並返回乙個陣列副本 引數start是擷取的開始陣列索引,end引數等於你要取的最後乙個字元的位置值加上...

氣泡排序和插入排序傻傻分不清

氣泡排序和插入排序的時間複雜度相同,容易搞混淆。氣泡排序最壞情況時間複雜度o n 2 最好情況時間複雜度o n 插入排序最壞情況時間複雜度也是o n 2 最好情況時間複雜度也是o n 氣泡排序和插入排序都是穩定的,穩定是指如果兩個數相等,排序過後它們的前後順序不變。如a b,排序前a在b的前面,排序...