とのソースコードを比較すると、clojure.lang.Refどちらも。clojure.lang.Atomから継承していることがわかりclojure.lang.ARefます。
中clojure.lang.ARefには、notifyWatchesすべてのウォッチ機能に変更が加えられたことを知らせる機能があります。
swap!とは、その実装の呼び出しでreset!機能します。clojure.lang.AtomnotifyWatches
例えば。
public Object swap(IFn f) {
for(; ;)
{
Object v = deref();
Object newv = f.invoke(v);
validate(newv);
if(state.compareAndSet(v, newv))
{
notifyWatches(v, newv);
return newv;
}
}
}
ただし、で検索しnotifyWatchesてclojure.lang.Refも何も表示されません。関数は次の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のすべてのウォッチ関数はどのように通知されますか?