Scala函式式程式設計(六) 閉包

2021-08-07 03:38:20 字數 2010 閱讀 5341

john d. cook 

給物件和閉包(

closure

)下過乙個經典的定義:「

anobject is data with functions. a 

closure 

is a function with data」

[[1]

] ,可以看到,閉包是由函式和執行時的資料決定的,閉包也因此被稱為

lambda

函式。事實上,閉包可以理解為函式和上下文,例如:

scala> var i=15

i: int = 15

//定義乙個函式字面量f,函式中使用了前面定義的變數i

scala> val f=(x:int)=>x+i

f: int => int =

//執行函式

scala> f(10)

res0: int = 25

//變數重新賦值

scala> i=20

i: int = 20

//執行函式

scala> f(10)

res1: int = 30

**valf=(x:int)=>x+i

定義了乙個函式字面量,函式中使用了自由變數

i,變數

i在程式的執行過程中會發生變數,在函式執行時如呼叫

f(10)

時會根據執行時變數

i的值不同,得到不同的執行結果。自由變數

i在執行過程中會不斷發生變化,它處於一種開放狀態,而當函式執行時,自由變數

i的值已經被確定下來,此時可以認為在執行時它暫時處於封閉狀態,這種存在開放到封閉過程的函式被稱為

閉包。函式字面量

val f=(x:int)=>x+i

中便是函式(f)

+上下文(自由變數

i)的結合。

val f=(x:int)=>x+i只是函式閉包的一種形式,高階函式也可以理解為一種閉包,例如:

//高階函式a,函式有兩個引數:函式型別double=>double的引數f、double=>unit的引數p

scala>  def    a(f:double=>double,p:double=>unit)=

a: (f: double => double, p: double =>unit)unit

//定義乙個輸入引數為double,返回值型別為double的函式

scala> val f=(x:double)=>x*2

f: double => double =

//定義乙個輸入引數為double,返回值型別為unit的函式

scala> val p=(x:double)=>println(x)

p: double => unit =

//將定義的函式f、p作為高階函式a的引數

scala> a(f,p)

20.0

定義另外乙個輸入引數為double,返回值型別為double的函式

scala> val f2=(x:double)=>x*x

f2: double => double =

//將定義的函式f2、p作為高階函式a的引數

scala> a(f2,p)

100.0**

def a(f:double=>double,p:double=>unit)=

定義了高階函式

a,該函式使用兩個不同函式型別作為引數,

f:double=>double

表示函式

f的引數型別為

double

、返回值型別為

double

,p:double=>unit

表示函式

p的引數型別為

double

,返回值型別為

unit

。函式在執行時會根據傳入的不同函式,得到不同執行結果,如執行

a(f,p)

和a(f2,p)

得到的結果是不一樣的,它也是由函式(高階函式

a)和上下文(傳入的函式f、

f2、p)構成的。

閉包函式 scala

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

函式式程式設計 閉包

def curve pie a 25 defcurve x return a pow x,2 return curve f curve pie print f 2 輸出結果 ans 100 檢驗函式是否閉包 print f.closure 環境變數 a 25 print f.closure 0 ce...

函式式程式設計與閉包

函式式程式設計 functional programming,fp fp是程式設計正規化之一,他和物件導向程式設計是並列的關係,函式式程式設計我們可以認為是一種思維的方法,加上他的實現方法,我們常聽說的程式設計正規化還有面向過程程式設計 物件導向程式設計。面向過程其實就是現實世界的處理方式,一步一步...