这个问题更像是提出的解决方案而不是问题,这使得我很难将其当作工单提交。我不确定CLJ-2094是否是你们真正关心的问题,或者是否是其他问题?如果是其他问题,请分享。
尝试在这里对建议的解决方案进行文字描述...当找到一个协议方法匹配时,通过var查找当前的协议值(可能已经被新扩展更新过),而不是使用传递的协议值(因为它可能不再表示当前状态)。
但是协议已经具有在扩展添加到协议时重置其状态的机制,所以我认为这个问题已经被很大程度上解决了。唯一不会匹配当前状态的情况是,你拥有的协议状态不再连接。在这种情况下,我想这是因为协议函数var持有的是一个实例函数,该实例有一个缓存,其中包括协议,但函数实例本身就是旧的(var持有新的函数实例)。
因此,你正在使用一个无效的函数,但在方法调用期间进行查找以恢复活动函数的等效状态。在调用调用链中添加var查找似乎是不可行的,因为整个协议设计都试图避免这种情况(这就是为什么我们有可以在修改时清除的缓存)。这里的替代解决方案是将函数的var查找推送到调用者。这正是CLJ-2094(与部分实现相比)中的匿名函数实现规范的地方。
再次,我不确定我们实际上试图解决什么问题。在CLJ-2094中,问题是函数被部分捕获。解决方案是——不要捕获值。我们也可以考虑某种替代品,它可以保留var查找 —— 你可以想象一个partial-var,它接收一个var而不是从符号中评估的函数。解决方法是使用wrap在函数中延迟评估。这个问题是否足够重要,需要新的解决方法?不知道。