在clojure中同时更新两个值

Xiu*_* Xu 1 clojure update-in

我想知道如何同时更新两个值.例如,我想同时增加月份和减少年龄.我的代码是

user=>(def users {:month 1 :age 26})
user=>(update-in users [:month :age] inc dec)
Run Code Online (Sandbox Code Playgroud)

我知道这种语法不正确,但我该如何解决这个问题呢?我需要同时更新.因为如果我先更新月份然后更新年龄,那么当我更新第二张地图时,第一张地图将丢失.还是有其他方法可以解决这个问题吗?

Joo*_*aat 5

update不修改值,它只返回一个新值,所以它只是一个函数.如果您需要更新地图的2个字段,那么直接的方法就是调用update两次,首先是在原始地图上,然后是第一次更新的结果:

(defn update-month-and-age [user]
  (update (update user :month inc) :age dec))
Run Code Online (Sandbox Code Playgroud)

哪个看起来更好使用->:

(defn update-month-and-age [user]
  (-> user
      (update :month inc)
      (update :age dec)))
Run Code Online (Sandbox Code Playgroud)

  • @XiufenXu不,那不对.`(update-month-and-age {:month 1:age 26})`为两个实现返回`{:month 2:age 25}`. (2认同)