通常我有一个包含深层嵌套结构的volatile或原子:
{ :deeply { :nested { ... } } }
swap!
返回完整的更新结构。但是相反,有时我想返回其他信息(例如,带有关于我所更改内容的信息的“ diff”,尤其是在我更改了多项内容的情况下)。
想到的一件事是为此定义另一个易失性变量,并将我想从swap!
返回的信息存储在该易失性变量中,以供以后使用。
那当然可以,但是我想知道是否还缺少我惯用的功能和功能?
另一种实用的样式方式是将深层结构的布局更改为类似
{:state { :deeply { :nested { ... } } } :diff nil }
我在:state
条目中添加了深层结构,在:diff
条目中添加了最新的差异。
有人在使用我所缺少的惯用法吗?
答案 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
会向您显示仅在左侧的值,仅在右侧的值以及两个值中的内容。