gpt4 book ai didi

clojure - 一次交换中的多个关联!操作例如。同时更新点的 x, y

转载 作者:行者123 更新时间:2023-12-01 00:25:14 25 4
gpt4 key购买 nike

我的问题是关于 clojure 原子中的嵌套映射/键以及如何同时更新它们。在我的情况下,我在另一个 map 中有一个嵌套 map ,它是一个持有小游戏原子的状态。

这是我的原子:

(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)

女巫当然不会工作,所以我尝试编写自己的 assoc-in-mult 函数,这就是我不成功的地方。

最佳答案

当 assoc-in 不适合您的使用模式时,因为您想要更新多个值,那么更通用的 update-inupdate功能往往运行良好。

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}}

关于clojure - 一次交换中的多个关联!操作例如。同时更新点的 x, y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45484308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com