从交换和vswap之类的函数返回一些信息

时间:2018-06-22 00:12:17

标签: clojure

通常我有一个包含深层嵌套结构的volatile或原子:

{ :deeply { :nested { ... } } }

swap!返回完整的更新结构。但是相反,有时我想返回其他信息(例如,带有关于我所更改内容的信息的“ diff”,尤其是在我更改了多项内容的情况下)。

想到的一件事是为此定义另一个易失性变量,并将我想从swap!返回的信息存储在该易失性变量中,以供以后使用。

那当然可以,但是我想知道是否还缺少我惯用的功能和功能?

另一种实用的样式方式是将深层结构的布局更改为类似

{:state { :deeply { :nested { ... } } } :diff nil }

我在:state条目中添加了深层结构,在:diff条目中添加了最新的差异。

有人在使用我所缺少的惯用法吗?

1 个答案:

答案 0 :(得分: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"}})

swap-vals!类似于swap!,但它返回旧的新值。 diff会向您显示仅在左侧的值,仅在右侧的值以及两个值中的内容。