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 关注
- 102 浏览
添加回答
举报