这个问题更像是一个解决方案的提议,而不是一个实际问题,这使得我很难将其作为工单提交。我不确定CLJ-2094是否是您真正关心的问题,还是其他问题?如果是其他问题,请分享。
在这里试着将提议的解决方案用文字表达出来……在找到协议方法匹配时,通过var检查当前协议值(这个值可能已被新扩展更新),而不是使用传入的协议值(因为这个值可能不再代表当前状态)。
但是,协议已经有了在协议中添加扩展时重置其状态的机制,所以我认为这个问题已经大部分解决了。唯一不会与当前状态匹配的协议状态可能是您拥有的协议状态已经不再连接。在这种情况下,我认为这是因为协议功能var持有的是一个缓存实例,包含协议,而功能实例本身是旧的(var持有一个新的功能实例)。
因此,您正在使用一个废弃的功能,但在方法调用期间执行查找以恢复活动功能的等效状态。在调用路径中添加var查找我认为不是一个可行的方案,因为整个协议设计都试图避免这样做(这就是为什么我们有可以在修改时清空的缓存)。这里的替代方案是将函数的var查找推送到调用者。这正是CLJ-2094中规范的非匿名函数实现所获得的(与部分相反)。
同样,我不确定我们实际上试图解决什么问题。在CLJ-2094中,问题是函数被部分捕获。解决方案是不捕获值。我们也可以考虑一些替代方案,保留var查找——可以想象有一个部分-var,它接受一个变量而不是从符号计算出的函数。作为解决方案,可以使用wrap在函数中延迟评估。这足够成为一个新问题的理由吗?我不知道。