这个问题更像是一个待解决的问题而非真正的难题,这使得我难以将其作为一个工单提交。我不确定CLJ-2094是不是您实际关心的问题,或者是其他问题?如果是其他问题,请分享。
在此尝试用文字描述提出的解决方案...在找到协议方法匹配时,通过var查找当前协议值(可能已经被新扩展更新),而不是使用传入的协议值(因为它可能不再代表当前状态)。
但是,协议本身就有在添加扩展时重置自身状态的机制,因此我认为这个问题已经基本解决。唯一不匹配当前状态的情况是协议状态已不再连接。在这种情况下,我认为这是因为协议的函数var持有一个实例,此实例有一个缓存,其中包含协议,而函数实例本身是旧的(var持有新的函数实例)。
因此,您使用了一个已弃用的函数,但在方法调用期间进行查找以恢复实时函数的等效状态。在调用路径中添加var查找似乎是不可行的,因为整个协议设计试图避免这一点(这就是我们为什么有一个可以在修改时清除的缓存)。另一种解决方案是将函数的var查找推送给调用者。这正是CLJ-2094中匿名函数实现对规范的建议(相对于部分实现)所得到的。
再次,我不确定我们真正试图解决什么问题。在CLJ-2094中,问题是函数被部分捕获。解决方案是——不要捕获值。我们还可以考虑一些替代部分的方法,该方法保留了var查找——您可以考虑一个partial-var,它接受一个变量而不是从符号解析得到的功能。解决方案是在函数中使用wrap来延迟评估。这是否足够成为一个问题而需要新的解决方案?不知道。