考虑clojure repl中的以下代码序列
(def elems (atom {}))
(swap! elems assoc 42 [:a 7])
elems
产生预期的{42 [:a 7]}
。现在试试
(compare-and-set! elems elems (atom {}))
生成false
,意味着compare-and-set!
操作未成功。我很惊讶,因为我希望elems
在elems
操作中与compare-and-set!
测试相同。我知道我可以使用reset!
来实现无条件重置原子的目标,但我想知道为什么compare-and-set!
不能完全相同?
答案 0 :(得分:5)
compare-and-set!
适用于原子引用的值,而不适用于原子本身。
clojure.core/compare-and-set!
([atom oldval newval])
Atomically sets the value of atom to newval if and only if the
current value of the atom is identical to oldval. Returns true if
set happened, else false
你可能想要这个:
(compare-and-set! elems @elems {})