首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在clojure中更改原子映射?

如何在clojure中更改原子映射?
EN

Stack Overflow用户
提问于 2019-09-25 19:10:07
回答 2查看 1K关注 0票数 2

我是clojure新手,我需要更新这个原子中的两个值:

代码语言:javascript
复制
(def app-state (atom {:id "1":status 0 :st 0}))

我正在使用以下内容:

代码语言:javascript
复制
(let [value (mod (+ (:st @app-state) 1) 4)]
    (swap! app-state update-in [:status] value)
    (swap! app-state update-in [:st] inc))

我得到了:

代码语言:javascript
复制
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-25 21:46:42

update-in的第三个参数接受一个函数,但您提供的是一个长参数(value),这就是为什么会出现异常。您可以改用assoc-in,它直接获取要在映射中关联的值:

代码语言:javascript
复制
(swap! app-state assoc-in [:status] value)

但是,您应该在传递给swap!的函数中以原子方式完成状态的整个更新。

代码语言:javascript
复制
(swap! app-state (fn [{:keys [st] :as state}]
                    (let [st-next (inc st)
                          value (mod st-next 4)]
                       (merge state {:st st-next
                                     :status value}))))
票数 4
EN

Stack Overflow用户

发布于 2019-09-29 12:25:42

下面是一个基于你的问题的repl会话。首先,我定义的app-state与您发布的完全一样。接下来,我将bump-state定义为一个匿名函数#(…),它接受一个参数,即app-state的当前值,由%占位符表示。let表单将:st键的递增值绑定到st。最后,assoc通过将新值与前一个映射的:st:status关联起来,返回一个新的不可变映射。

接下来的几行代码只需调用swap!来确认bump-state是否正常工作。最后一行在对swap!的调用中直接定义了匿名函数。虽然accepted answer运行良好,但我认为这更简洁一些。

代码语言:javascript
复制
user=> (def app-state (atom {:id "1":status 0 :st 0}))
#'user/app-state
user=> (def bump-state #(let [st (inc (:st %))] (assoc % :st st :status (mod st 4))))
#'user/bump-state
user=> (swap! app-state bump-state)
{:id "1", :status 1, :st 1}
user=> (swap! app-state bump-state)
{:id "1", :status 2, :st 2}
user=> (swap! app-state bump-state)
{:id "1", :status 3, :st 3}
user=> (swap! app-state bump-state)
{:id "1", :status 0, :st 4}
user=> (swap! app-state #(let [st (inc (:st %))] (assoc % :st st :status (mod st 4))))
{:id "1", :status 1, :st 5}

swap!的整个思想是,您的更新函数对原子持有的当前不可变值进行操作,并返回一个新的不可变值来替换它。您的update函数只是一个纯函数,它可以让您更容易地推断它,并在repl中使用它,就像其他函数一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58097034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档