我的问题是关于clojure原子中的嵌套地图&键,以及如何同时更新它们。在我的情况下,我在另一个地图中有一个嵌套地图,这是一个持有小游戏原子的状态。
这是我的原子:
(def state (atom {:mousePos {:x 0 :y 0}
:playArea {:width 10000 :height 10000}
:player {:zoomOut 7.5
:cells [{:center {:x 1234 :y 5678}
:radius 17.84124116
:area 1000}]
:gravityCenter {:x 1234 :y 5678}
:gravityRadius 17.84124116}}))
在这个原子中我想同时更新mousePos x和y值以确保它们的一致性和并发性。
目前我正在做:
(swap! state assoc-in [:mousePos :x] mouseX)
(swap! state assoc-in [:mousePos :y] mouseY)
但是那些是两个交换!理论上如果在我之间切换的线程可以最终解决问题,那么对于其他线程中的以下操作,我会使用当前的x但是鼠标的旧y位置,我不想要那个。
所以我希望做这样的事情:
(swap! state assoc-in [:mousePos :x] mouseX
[:mousePos :y] mouseY)
Witch当然不会工作所以我尝试编写自己的assoc-in-mult函数,这就是我不成功的地方。
答案 0 :(得分:1)
当update-in不符合您的使用模式时,因为您在这里想要更新多个值,那么更通用的update-in
或update
函数往往效果很好。
user> (def state (atom {:mousePos {:x 0 :y 0}}))
#'user/state
user> (swap! state update-in [:mousePos] assoc :x 123 :y 321)
{:mousePos {:x 123, :y 321}}
或者在更新路径中只有一个kay:
user> (swap! state update :mousePos assoc :x 123 :y 321)
{:mousePos {:x 123, :y 321}}