裁判如何在clojure通知其手表?

裁判如何在clojure通知其手表?,clojure,Clojure,比较clojure.lang.Ref和clojure.lang.Atom的源代码,我发现它们都继承自clojure.lang.ARef 在clojure.lang.ARef中有一个函数notifywatchs,它让所有的watch函数都知道已经进行了更改 交换和重置函数在其实现中调用notifyWatches 例如 然而,当我在clojure.lang.Ref中搜索notifyWatches时,它什么也没有找到。alter函数如下所示 public Object alter(IFn fn, IS

比较
clojure.lang.Ref
clojure.lang.Atom
的源代码,我发现它们都继承自
clojure.lang.ARef

clojure.lang.ARef
中有一个函数
notifywatchs
,它让所有的watch函数都知道已经进行了更改

交换
重置clojure.lang.Atom中的code>函数在其实现中调用
notifyWatches

例如

然而,当我在
clojure.lang.Ref
中搜索
notifyWatches
时,它什么也没有找到。
alter
函数如下所示

public Object alter(IFn fn, ISeq args) {
   LockingTransaction t = LockingTransaction.getEx();
   return t.doSet(this, fn.applyTo(RT.cons(t.doGet(this), args)));
}

如果没有任何方法调用notifyWatches,ref的所有watch函数如何得到通知?

扩展了notifyWatches方法,并提供了notifyWatches方法

您要查找的对
notifyWatches的调用发生在
LockingTransaction
类的
run
方法中

对引用的更改发生在事务中。请注意,对
LockingTransaction
doSet
方法的调用被传递到
this
(参考Ref)。将在交易中应用的变更由
doSet
方法确定,但该变更在
LockingTransaction
run
方法中生效。当事务成功运行时,使用对
doSet
记录的Ref的引用调用
notifyWatches

public Object alter(IFn fn, ISeq args) {
   LockingTransaction t = LockingTransaction.getEx();
   return t.doSet(this, fn.applyTo(RT.cons(t.doGet(this), args)));
}