这个问题更多的是一个提议的解决方案,而不是一个问题,这使得我很难将其作为工单提交。我不确定CLJ-2094是否是您关心的真正问题,还是其他什么问题?如果是其他问题,请分享。
试图用文字描述这里提出的解决方案... 在找到一个协议方法匹配时,通过var查找当前的协议值(可能已被更新的新扩展),而不是使用传递的协议值(因为它可能不再代表当前状态)。
但是,协议已经有机制在添加扩展到协议时重置其状态,所以我认为这个问题已经基本上得到解决。唯一可能导致协议状态不匹配当前状态的情况是,您拥有的协议状态已不再连接。在这种情况下,我认为这是因为协议函数var持有函数实例,该实例有一个缓存,其中包含协议,但函数实例本身是旧的(var持有新的函数实例)。
因此,您正在使用一个已死的函数,但在方法调用期间进行查找以恢复活动函数的等效状态。在调用路径中添加var查找我认为是不可行的,因为整个协议设计都在试图避免这种情况(这就是为什么我们有可以在修改时丢弃的缓存)。这里的替代方案是将函数的var查找推送到调用者。这正是CLJ-2094中规格说明的匿名函数实现(与分片相比)所得到的。
再次,我不确定我们实际上试图解决的问题是什么。在CLJ-2094中,问题是函数被分片捕获。解决方案是 - 不要捕获值。我们还可以考虑一些不保留var查找的分片替代方案 - 你可以想象一个partial-var,它接受一个var而不是从符号评估的函数。解决方法是使用wrap在函数中以延迟评估。这个问题是否足以引发新事物的出现?不知道。