如何以不可变方式更新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
相关产品推荐
相关产品推荐

