2 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
要理解的關(guān)鍵是這一行:
h = mh(h)
不調(diào)用函數(shù)h
。它調(diào)用mh()
函數(shù),該函數(shù)只返回一個(gè)函數(shù)值,但它不調(diào)用h()
任何一個(gè)。如果將調(diào)用返回的函數(shù)值,那將調(diào)用h()
.
所以該main()
函數(shù)將一個(gè)函數(shù)值存儲(chǔ)在 中h
,然后調(diào)用h()
。
這h()
將打印"before"
,然后包裝 h
在另一個(gè)函數(shù)中,并將結(jié)果存儲(chǔ)在h
,然后打印"after"
。重要的是要知道包裝函數(shù)(由 返回的值mh()
)是一個(gè)閉包,它存儲(chǔ)了 的原始值h
,因此將結(jié)果分配給h
不會(huì)影響h
包裝函數(shù)內(nèi)部。
所以h
通過(guò)調(diào)用h
現(xiàn)在是包裝函數(shù)來(lái)結(jié)束。包裝函數(shù)從打印開(kāi)始"return"
,然后調(diào)用原始的未包裝函數(shù)h
。
原始的,h
再次展開(kāi)打印"before"
,然后它包裝當(dāng)前值h
(這是包裝函數(shù)),將其存儲(chǔ)在中h
,然后打印"after"
。
然后調(diào)用h
,它現(xiàn)在是一個(gè) 2 次包裝函數(shù)。它從打印開(kāi)始"return"
,然后調(diào)用保存的h
值,這是一個(gè) 1 次包裝函數(shù)。1 次包裝函數(shù)從"return"
(再次)打印開(kāi)始,然后繼續(xù)原始函數(shù),打印"before"
, wrapsh
現(xiàn)在將被 3 次包裝,將其存儲(chǔ)在 中h
,然后調(diào)用h
(這是 3 次包裝函數(shù)值) ...
如此邏輯下去,存儲(chǔ)的函數(shù)值h
會(huì)越來(lái)越wrapped,被wrapped的函數(shù)總是有一個(gè)少一次wrapped previous function的保存值。
隨著“迭代”的繼續(xù),“包裝深度”增加,因此您會(huì)看到越來(lái)越多的"return"
語(yǔ)句被打?。ㄒ?yàn)檫@就是包裝的作用)。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
罪魁禍?zhǔn)资沁@個(gè)任務(wù):
h = mh(h)
它取代了在任何返回之前/之后打印出的匿名函數(shù)中的h
in的綁定。main
mh
如果你更換
h = mh(h) fmt.Printf("after func h=%x\n", h) return h(name)
和
return mh(h)(name)
你會(huì)得到你期望的相互遞歸
- 2 回答
- 0 關(guān)注
- 173 瀏覽
添加回答
舉報(bào)