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