Scala方法與函式(四)
scala中有方法和函式,兩則有一些區別。方法與Java中的方法類似,方法是組成類的一部分。函式則是一個完整的物件,scala 中的函式其實就是繼承了 Trait 的類的物件,scala 中使用val語句可以定義函式,def語句定義方法.
class Test{ //定義了一個方法,方法是使用def定義 def m(x: Int) = x + 3 //定義了一個函式,函式使用val定義 val f = (x: Int) => x + 3 }
一、方法的宣告、定義
方法的宣告格式如下:
def functionName ([引數列表]) : [return type]
注:如果不寫等於號和方法主體,那麼方法會被隱式宣告為抽象(abstract) ,包含它的型別於是也是一個抽象型別。
scala 方法定義格式如下:
def functionName ([引數列表]) : [return type] = {
function body
return [expr]
}
方法定義由一個def關鍵字開始,緊接著是可選的引數列表,一個冒號 :和方法的返回型別,一個等於號=,最後是方法的主體。return type可以是任意合法的 Scala 資料型別。引數列表中的引數可以使用逗號分隔。
方法的呼叫: 方法名(引數列表)
案例如下:
如果方法沒有返回值,可以返回為Unit或者直接不寫返回值,這個類似於Java 的void
注意:返回值為Unit或者沒寫返回值,在方法體內部使用了return進行返回資料,此時也是無效的,返回結果均為()。
看下下面例子:
(n1+n2)計算結果為Int,返回值型別為Float或者Double,會自動進行型別轉換
(n1+n2)計算結果為Int,返回值型別為Byte,Char等,編譯不會通過
再看下圖:
方法無引數時,可以省略(),直接使用方法名進行呼叫,注意m2和m3方法的呼叫,m2可以使用m2或者m2()進行呼叫,m3只能使用m3方法名呼叫,m3()編譯會出錯。
二、方法與函式的區別
例子:
scala> def m1(x:Int) = x+3 m1: (x: Int)Int scala> val f1 = (x: Int) => x+3 f1: Int => Int = <function1>
方法是一個以def開頭的帶有引數列表(可以無引數列表)的一個邏輯操作塊,這正如object或者class中的成員方法一樣。
函式是一個賦值給一個變數(或者常量)的匿名方法(帶或者不帶引數列表),並且通過=>轉換符號跟上邏輯程式碼塊的一個表示式。=>轉換符號後面的邏輯程式碼塊的寫法與method的body部分相同
1.方法可以轉化為函式,使用 方法名 _
看下下面輸出結果:
直接列印方法m,報錯,說明方法必須攜帶引數進行呼叫,或者可以改寫下輸出,println(m _),println(m(_)),參考下圖,圖中m _ 和 m(_)實則將方法轉化為函式物件
方法轉函式:
2、函式可作為一個引數傳入到方法中,而方法不行
本文參考菜鳥教程-scala
教程中寫到 "函式必須有引數列表 ",這個案例我試了下,發現並沒有問題,我的scala版本是 2.13.3
不知道是不是scala版本的原因,因為菜鳥上的案例是2年前寫的
暫時記錄這裡...