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