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