在Scala中使用函數語言程式設計(函式和高階函式)
阿新 • • 發佈:2018-12-04
圖示,這是一個普通函式的定義(在java裡面通常稱為方法),函式可以定義在object單例物件中
1 object MyModule { //宣告一個單例物件 —> 即同時宣告一個類和它的唯一例項 2 def abs(n: Int): Int = //abs方法接收一個integer並返回一個integer3 if (n < 0) -n //如果n小於0,返回-n 4 else n //否則返回n 5 6 private def formatAbs(x: Int) = { //一個私有方法只能被MyModule裡的其他成員呼叫 7 val msg = "The absolute value of %d is %d" //字串裡有2個佔位符,%d代表數字 8 msg.format(x,abs(x)) //在字串裡將2個%d佔位符分別替換為x和abs(x) 9 } 10 11def main(args: Array[String]): Unit = { //Unit類似於Java或C語言裡的void 12 println(formatAbs(-42)) 13 } 14 }
一些基礎概念:
通過def去定義一個函式,等號“=”左邊的宣告部分我們稱為“函式簽名”,右邊則為“定義”
val定義的變數的是一個值相當於java中的final,不可變
Unit相當於型別空,當一個函式的返回值為空時,字面上會返回 "()"
通常返回Unit型別的函式,暗示它包含副作用
模組、物件和名稱空間:
Scala總每個值都可以當成一個物件,每個物件都有零個或多個成員
物件的主要目的是給成員一個名稱空間,也稱模組
區別於JAVA,Int在Scala中也被視為物件 --->
1+2 可以看成1.+(2)的語法糖(只有物件才可以通過"."來呼叫成員)
高階函式:
把一個函式當作引數傳遞給另一個函式被稱為高階函式
函式是一等公民,函式也是值
注:對於高階函式的引數,我們通過以f、g來命名是一種習慣做法。在
函數語言程式設計中,我們更傾向於使用短的變數名,甚至單個字母命名。因為高階函式通常沒
法表示引數到底執行什麼,無法體現它們的含義(變數名的約定)
預設引數:
1 object HelloWorld { 2 def main(args: Array[String]): Unit = { 3 default() //預設引數:呼叫時沒有手動傳參,函式引數列表預設使用初始值 4 default("You") 5 } 6 7 def default(name: String = "My"): Unit = { //這裡給予引數列表一個初始值 8 println("hello "+name) 9 } 10 }