Scala 閉包

2022-05-13 15:16 更新

閉包是一個(gè)函數(shù),它的返回值取決于在該函數(shù)之外聲明的一個(gè)或多個(gè)變量的值。

例子

讓我們創(chuàng)建一個(gè)乘法器函數(shù)如圖所示:

var y = 3
val multiplier = (x:Int) => x * y

現(xiàn)在,y具有對函數(shù)外部的變量的引用,但是在包圍范圍中。

object Main extends App { 
    var y = 3
    val multiplier = (x:Int) => x * y
    println(multiplier(3))
} 

部分應(yīng)用功能

在函數(shù)式編程語言中,調(diào)用帶有參數(shù)的函數(shù)是將函數(shù)應(yīng)用于參數(shù)。

當(dāng)所有參數(shù)都傳遞給函數(shù)時(shí),我們將函數(shù)完全應(yīng)用于所有參數(shù)。

一個(gè)簡單的添加函數(shù):

val add = (x: Int, y: Int) => x + y
add(1,2)

但是當(dāng)我們只給函數(shù)一個(gè)子集的參數(shù),表達(dá)式的結(jié)果是一個(gè)部分應(yīng)用的函數(shù)。

val partiallyAdd = add(1, _:Int)

因?yàn)槲覀儧]有為第二個(gè)參數(shù)提供值,所以變量部分Add是一個(gè)部分應(yīng)用的函數(shù)。

當(dāng)給予 partiallyAdd 一個(gè)Int值2時(shí),你得到傳遞到add和partiallyAdd函數(shù)的Int數(shù)的總和:

partiallyAdd(2)

當(dāng)我們提供所有參數(shù)時(shí),執(zhí)行原始函數(shù),產(chǎn)生結(jié)果。

Curried函數(shù)

Currying轉(zhuǎn)換具有多個(gè)參數(shù)的函數(shù),創(chuàng)建一個(gè)函數(shù)鏈,每個(gè)函數(shù)都需要一個(gè)參數(shù)。

下面的代碼創(chuàng)建了添加兩個(gè)Int參數(shù)a和b的add函數(shù),如下所示:

val add = (x: Int, y: Int) => x + y
add(3,3)

在Scala中,curried函數(shù)使用多個(gè)參數(shù)列表定義,如下所示:

def add(x: Int)(y: Int) = x + y

我們還可以使用以下語法定義curried函數(shù):

def add(x: Int) = (y: Int) => x + y

而不是兩個(gè)Int參數(shù)的一個(gè)列表,您應(yīng)用curry add函數(shù)到一個(gè)Int參數(shù)的兩個(gè)列表。

因此curry add函數(shù)看起來像這樣:

def curriedAdd(a: Int)(b: Int) = a + b
curriedAdd(2)(2)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號