通常我有一个包含深度嵌套结构的volatile或atom,如下所示:
{ :deeply { :nested { ... } } }
Run Code Online (Sandbox Code Playgroud)
swap!返回完整,更新的结构.但相反,我有时会想要返回其他信息(比如一种"差异",其中包含我所改变的信息,特别是在我改变多项内容的情况下).
我想到的一件事是为此定义另一个volatile变量,并存储我想从swap!volatile变量中返回的信息以供以后使用.
这当然会奏效,但我想知道是否有一些我不知道的更具惯用性和功能性的东西.
另一种功能性的方式是将深层结构的布局改为类似的
{:state { :deeply { :nested { ... } } } :diff nil }
Run Code Online (Sandbox Code Playgroud)
我把深层结构放入:state条目,最近的差异进入:diff条目.
人们正在使用哪些我不相称的东西?
这很容易swap-vals!(仅限Clojure 1.9+)和clojure.data/diff:
(def a (atom {:deeply {:nested "value"}}))
(let [[old new] (swap-vals! a assoc-in [:deeply :other] "foo")]
(clojure.data/diff old new))
=> (nil
{:deeply {:other "foo"}}
{:deeply {:nested "value"}})
Run Code Online (Sandbox Code Playgroud)
swap-vals!就像swap!它,但它返回旧的和新的价值.diff向您显示仅在左侧值中的值,仅在正确的值中,以及两个值中的值.