You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以不可变方式更新Clojure record的指定字段

不可变更新Clojure Record字段的简洁方案

Clojure 中defrecord生成的类型默认实现了关联集合接口,无需手动拷贝全量字段,直接用原生集合操作函数即可实现符合要求的不可变更新,两种常用写法如下:

固定值更新场景:使用assoc

如果你要把z直接修改为固定值99,直接调用assoc即可:

(def new-location (assoc location :z 99))

该操作会返回全新的Point类型实例,原有location实例不会发生任何改动,完全满足不可变要求。如果需要同时修改多个字段,直接在assoc后追加键值对即可:

;; 同时修改x和z字段
(def new-location (assoc location :x 10 :z 99))

基于旧值计算新值场景:使用update

如果新字段值需要依赖原有字段的值计算生成,可以用update简化写法:

;; 示例:原有z值加96得到新值99
(def new-location (update location :z + 96))

补充说明

  • 以上操作返回的结果都是和原实例同类型的Record,不会变成普通Map
  • 如果需要删除Record字段可以用dissoc,但删除字段后的返回结果会退化为普通Map,不再是原Record类型

内容的提问来源于stack exchange,提问作者Flux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:48:00