2 回答

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

TA貢獻1853條經驗 獲得超9個贊
罪魁禍首是這個任務:
h = mh(h)
它取代了在任何返回之前/之后打印出的匿名函數中的h
in的綁定。main
mh
如果你更換
h = mh(h) fmt.Printf("after func h=%x\n", h) return h(name)
和
return mh(h)(name)
你會得到你期望的相互遞歸
- 2 回答
- 0 關注
- 155 瀏覽
添加回答
舉報