从swap和vswap等函数中返回一些东西

Eug*_*sky 2 clojure

通常我有一个包含深度嵌套结构的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条目.

人们正在使用哪些我不相称的东西?

Tay*_*ood 6

这很容易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向您显示仅在左侧值中的值,仅在正确的值中,以及两个值中的值.