1. 程式人生 > >scala 中方法和函式的區別

scala 中方法和函式的區別

定義

方法和函式是作為兩種東西在scala中存在的,在大多數時候他們差不太多,但是時不時的可能會有一些問題體現出他們各自不一樣的情況。

函式型別:形式為(T1,…, Tn) => U,其實是FunctionN trait的簡寫形式,匿名函式和方法值具有這種型別(其實可以作為方法型別的一部分)
方法型別:一個非值型別(non-value type),裡邊是沒有值的,一個方法值具有函式型別,用def定義。

方法

方法在scala中和java中一樣,是一個類的一個部分

函式

函式在scala中是一個完整的物件,是一系列trait(FunctionN)的實現,由於scala “apply”的特殊語法,也就是說obj.apply()可以用obj()的方式進行呼叫,所以函式可以直接用後跟括號的方式進行呼叫

區別的一部分細節

1.方法不能作為單獨的存在,除非引數為空,函式可以

def m(x: Int) = 2 * x

這是一個方法,因為不能單獨存在,所以不能直接呼叫

val f = (x: Int) => 2 * x

這是一個函式,就可以單獨進行呼叫,因為f其實是一個trait的實現(FunctionN),相當於f.apply()

2.方法可以沒有引數列表,函式必須有,也就是引數列表方法可省略,函式不可省略

def m1 = 100
def m2() = 100
//這兩個都是方法,接受引數都是0個,第一種省略了引數列表,第二個沒有
val f1 = () => 100
//val f2 = =>100 沒有這種寫法

3.函式名後必須加括號才代表函式呼叫,否則為該函式本身,而方法名後不加括號為方法呼叫

4.方法可以進行eta展開,即自動轉換為函式

5.方法不是值,函式是值,所以方法不能繫結給一個val變數,函式可以

6.方法有過載情況時,如果自動將方法轉換為函式,需要指定引數和返回值型別

7.方法可以使用引數序列,轉換稱函式使用Seq物件

8.方法支援預設引數值,函式不能省略引數,不支援