这个问题更多的是一个解决方案的提议,而不是一个问题,这使得我不太确定是否将其作为问题报告提交。我不确定CLJ-2094是否是你们真正关心的问题,还是其他什么问题?如果是其他问题,请分享一下。
在这里尝试将建议的解决方案用文字表达出来... 当找到协议方法匹配时,通过 var 查找当前协议值(可能带有新扩展已更新),而不是使用传递的协议值(因为可能已不再代表当前状态)。
但是,协议已经具有添加扩展到协议时重置其状态的机制,因此我认为这个问题已经基本解决。唯一不会使协议状态与当前状态匹配的情况是,您所拥有的协议状态不再连接。在这种情况下,我认为这是因为协议函数 var 保持一个函数实例,该实例有一个缓存,包含协议,但函数实例本身是旧的(var 保持一个新的函数实例)。
因此,您正在使用一个已死去的函数,但在方法调用期间进行查找以恢复活动函数的等效状态。我认为在调用路径中添加 var 查找并不是一个好主意,因为整个协议设计试图避免这种情况(这也是为什么我们有可以在修改时清除的缓存)。这里的替代方案是将函数的 var 查找推到调用者那里。这正是您在 CLJ-2094 中通过匿名函数实现的规范(与部分相对)所得到的。
再次,我不确定我们实际上试图解决的问题是什么。在 CLJ-2094 中,问题是被部分捕获的函数。解决方案是——不要捕获值。我们还可以考虑一些可以保留 var 查找的部分替代方案——您可以想象一个用于接受 var 而不是从符号中解析的函数表达式的部分-var。作为解决方案,可以在函数中使用 wrap 来延迟评估。这是否足够成为一个新问题?不知道。