裁判如何在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)));
}