2 回答

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
Go 以非常典型/標(biāo)準(zhǔn)的方式處理一流的函數(shù)和閉包。在這種情況下,調(diào)用adder
自身:
創(chuàng)建以 value
int
命名的對(duì)象。sum
0
返回一個(gè)閉包:一個(gè)類似函數(shù)的東西1,當(dāng)被調(diào)用時(shí),可以訪問(wèn)變量
sum
。
返回的特定類似函數(shù)的東西adder
(其調(diào)用者在普通變量中捕獲)是一個(gè)帶有一個(gè)參數(shù)的函數(shù)。然后你調(diào)用它,傳遞一個(gè)參數(shù)。這種參數(shù)傳遞沒(méi)有什么特別之處:它的工作方式與其他地方相同。在類似函數(shù)的東西中,使用變量x
可以獲取調(diào)用者傳遞的值。使用名稱sum
可以獲取捕獲的int
對(duì)象,無(wú)論其值是什么。從函數(shù)返回后,捕獲的內(nèi)容int
仍然被捕獲,因此稍后調(diào)用相同的類似函數(shù)的東西會(huì)看到int
中的更新sum
。
通過(guò)調(diào)用adder
兩次,您會(huì)得到兩個(gè)略有不同的類似函數(shù)的東西:每個(gè)都有自己的私有sum
.?這兩個(gè) privatesum
最初都為零。調(diào)用您保存了值的類似函數(shù)的東西pos
可以獲得使用其中之一的函數(shù)。調(diào)用稍微不同的類似函數(shù)的東西,你保存了它的值,neg
你就可以得到使用另一個(gè)函數(shù)的函數(shù)。
1這個(gè)“類似函數(shù)的東西”和實(shí)際的函數(shù)之間沒(méi)有真正的區(qū)別,只是這個(gè)特定的類似函數(shù)的東西沒(méi)有可以調(diào)用它的名稱。這或多或少就是擁有一流功能的含義。
如果您遇到可讀性問(wèn)題......
其原始形式是:
func adder() func(int) int {
? ? sum := 0
? ? return func(x int) int {
? ? ? ? sum += x
? ? ? ? return sum
? ? }
}
讓我們用一些類型名稱和其他語(yǔ)法更改來(lái)重寫它,使代碼的核心保持不變。首先,讓我們起一個(gè)名字,意思是func(int) int:
type adderClosure func(int) int
然后我們可以用它來(lái)重寫adder第一行:
func adder() adderClosure {
? ? ...
}
現(xiàn)在讓我們?cè)诩臃ㄆ髦袆?chuàng)建一個(gè)局部變量來(lái)保存我們要返回的函數(shù)。為了明確和冗余,我們可以再次使用這種類型:
? ? var ret adderClosure // not good style: just for illustration
現(xiàn)在讓我們通過(guò)執(zhí)行以下操作將該變量分配給我們的閉包:
? ? sum := 0
? ? ret = func(x int) int {
? ? ? ? sum += x
? ? ? ? return sum
? ? }
然后我們可以return ret
返回閉包。?這是 Go Playground 上的完整代碼。

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)您分配和時(shí),該sum變量位于兩個(gè)閉包中。閉包中的是通過(guò)添加 1, 2, 3, 4(斐波那契風(fēng)格)來(lái)更新的,而閉包中的是通過(guò)在每次循環(huán)迭代中減去 2*1, 2*2, 2*3, 2*4 來(lái)更新的。posnegsumpossumneg
或者,更詳細(xì)地說(shuō): pos := adder()分配給一個(gè)函數(shù),該函數(shù)具有從0 開始的pos閉包。然后每當(dāng)您調(diào)用該函數(shù)時(shí),它都會(huì)相應(yīng)更新。和任何其他類似的作業(yè)也是如此。sumsumpossumneg
以下是一些類似(更簡(jiǎn)單)的 JavaScript 代碼,可在瀏覽器控制臺(tái)中運(yùn)行:
function adder() {
? var sum = 0;
? return function(i) {
? ? sum += i;
? ? return sum;
? }
}
var pos = adder();
console.log( pos(1) ); // add 1 to 0 (1)
console.log( pos(2) ); // add 2 to 1 (3)
console.log( pos(3) ); // add 3 to 3 (6)
console.log( pos(4) ); // add 4 to 6 (10)
- 2 回答
- 0 關(guān)注
- 153 瀏覽
添加回答
舉報(bào)