scala 學習筆記 07 一等公民的函式

2022-01-31 10:46:10 字數 1864 閱讀 7363

在scala中一切皆物件,一切皆函式,函式跟int,string、class等其它型別是處於同等的地位,換句話說,使用函式跟使用普通的型別一樣,沒什麼區別,因此:

1、函式可以賦值給變數,可以當引數傳遞

def helloworld(msg: string): unit = 

def foo =

def main(args: array[string])

x(foo,"ha ha")

//foo

//haha

}

上面這些**都是合法的

2、函式可以巢狀

既然class裡可以定義class,函式是一等公民,理應享受跟class同樣的待遇,因此當然也可以巢狀

def funa(arr: array[string]) = 

arr.foreach(x => println(funb(x)))

} def main(args: array[string])

3、所謂的偏函式

def add(a: int, b: int, c: int) = 

def main(args: array[string])

利用這個技巧,可以實現帶預設引數,引數個數不同的"過載"版本

4、閉包

def fun = 

funtest

println(i)

} def main(args: array[string])

funtest訪問了funtest定義範圍之外的變數 i

5、高階函式

def main(args: array[string])

列印一顆小樹冠,**如此簡單? 演算法邏輯見下圖,這不是重點,重點是上面這行**是函式疊函式,to是物件1的乙個函式,1 to (9,2),即從1到9,每次遞增2,最終即為1,3,5,7,9,然後用map函式對映成一行行星號,然後再用foreach函式,結合前置空格輸出

// move         len

// 4 * 1

// 3 *** 3

// 2 ***** 5

// 1 ******* 7

// 0********* 9

6、克里化(curring)

def add_1(a: int, b: int, c: int) = 

def add_2(a: int) = (b: int, c: int) =>

def add_3(a: int) = (b: int) => (c: int) =>

def main(args: array[string])

這個一直沒明白真正的用途,號稱是可以用來做引數的型別智慧型推斷,但我感覺只是可以把引數拆散,在引數的呼叫方式上,略有『鏈式』程式設計的風格

7、引數隱式轉換

def add(a: int, b: int) = a + b

def foo(a:int)=

def boo(a:string)=

implicit def convert(x: string): int =

} def main(args: array[string])

我們並沒有定義乙個形如add(a:string,b:string)的加法函式,但是最終即成功呼叫了add("one","two"),秘密在於implicit做了引數的隱式轉換,這乙個很強大的**,威力過於巨大,上面的這個轉換,會把當前**作用域的所有string引數,預設都按這個規則轉換,foo("one")輸出1就是證明,所以沒掌握精通前,建議小心使用。

一等公民的函式

所謂的 一等公民 指的是函式與其他的資料型別可以同等對待,如存入陣列,作為引數等等。先看個例子 const hi name hi const greeting name hi name 這裡的對hi這個函式又給與了重新的傳參操作,其實大可不必如此,因為hi已經被函式定義過了,在函式程式設計的思維中,...

Headfirst JS 函式是一等公民

目錄 一 函式表示式和函式宣告的底層實現 1 函式宣告 2 函式表示式 匿名函式 3 瀏覽器處理函式宣告的流程 4 將函式位址拷貝給函式指標變數的好處 5 使用函式宣告和函式表示式的細微差別 6 一等值 具有以下性質的值稱為以一等值 function quack num function creat...

python 第一等公民 方法

1.函式的定義 函式傳參的種類 1.普通傳參 def f1 name,age 2.多值傳入 def f2 name,arg 3.預設值傳入 def f3 name tom age none 4.傳入字典 def f4 name,args,kargs 5.注意 1.只能出現乙個 多了識別不了 def ...