scala 函式字面量 閉包 3種函式引數形式

2021-09-02 14:51:15 字數 1261 閱讀 5410

函式字面量:就是乙個函式作為表示式使用,有匿名函式的意思

def m = (x: int) => x + 1

println(m(1))

閉包:簡單說就是函式字面量+自由變數;在執行時,捕獲自由變數,從這個函式字面量建立出函式物件(函式值),叫做閉包

// 例子1

// 這個函式是建立並返回閉包的函式:每呼叫一次,就會產生乙個閉包

// 這裡的more是區域性變數,作用域是makeint函式內部

def makeint(more: int) = (x: int) => x + more

// 產生閉包:捕獲了more變數本身

val inc1 = makeint(1)

println(inc1(10))

// 例子2:閉包能看到閉包外對自由變數的修改

// 這裡的more,是全域性變數

var more = 1

// makeint是閉包

def makeint = (x:int) => x + more

println(makeint(2)) // 3

more = 4

println(makeint(2)) // 6

// 例子3:閉包的結果會被閉包外部看到

var more = 1;

val testlist = list(2,3,4)

// foreach函式裡面引用了自由變數more,也形成了閉包

testlist.foreach(more += _)

println(more)

相應的函式值結果,就叫做閉包,因為函式值是通過閉合這個動作產生的,比如inc1和inc99就是閉包

閉包這個詞,源於:「捕獲」自由變數從而閉合函式字面量的動作

閉包:捕獲的是自由變數本身,而不是自由變數引用的值

函式呼叫引數三種形式

重複引數,用*

def echo(args:string*)=

帶名字的引數,順序可以任意

def echo(arg:string, time:string)=

echo(time="10", arg="arg")

// 結果

// arg

預設值,預設值:zero如果沒傳入,自動賦值為0

def echo(arg:string, time:string, zero:int = 0)=

Scala函式字面量

scala中函式為頭等公民,你不僅可以定義乙個函式然後呼叫它,而且你可以寫乙個未命名的函式字面量,然後可以把它當成乙個值傳遞到其它函式或是賦值給其它變數。下面的例子為乙個簡單的函式字面量 參考整數字面量,3 為一整數字面量 x int x 1這是個函式字面量,它的功能為 1.符好 表示這個函式將符號...

Scala函式字面量簡化寫法

scala提供了多種方法來簡化函式字面量中多餘的部分,比如前面例子中filter方法中使用的函式字面量,完整的寫法如下 x int x 1首先可以省略到引數的型別,scala可以根據上下文推算出引數的型別,函式定義可以簡化為 x x 1這個函式可以進一步去掉引數的括號,這裡的括號不起什麼作用 x x...

閉包函式 scala

閉包函式 返回結果 依賴外部引數 正常函式 val mult x int 閉包函式 var factor 5 依賴引數 閉包函式mult1 val mult1 x int x factor println 閉包函式 mult1 在factor factor 時,結果為 mult1 10 factor...