1. 程式人生 > 實用技巧 >Scala方法與函式(四)

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年前寫的

暫時記錄這裡...