如何使用update函数更新Clojure中的map?
问题原因
Clojure的update函数的核心设计是基于原有键对应的值做函数运算来更新,固定语法规则为:(update 目标map 待更新的键 处理旧值的函数 & 函数额外参数)
你写的(update p :name "David")里第三个参数直接传了字符串,不符合函数类型要求,因此报错。
正确实现方案
方案1:使用assoc(更推荐,语义更匹配直接赋值的场景)
如果只是需要直接给指定键设置固定值,不需要依赖原有值做运算,直接用Clojure专门用于map赋值的assoc函数即可:
(assoc p :name "David") ;; 执行后返回结果:{:name "David", :age 26}
方案2:符合update语法要求的写法
如果确实需要使用update实现,给第三个参数传入一个返回固定值的函数即可,常见写法有两种:
- 用内置的
constantly函数生成返回固定值的函数:
(update p :name (constantly "David"))
- 自定义匿名函数忽略原有值直接返回新值:
(update p :name (fn [old-val] "David")) ;; 也可以用匿名函数简写:(update p :name #(identity "David"))
扩展说明
当你需要基于原有值做更新时,update的优势就会体现出来,比如要给原有年龄加1,直接写就行:
(update p :age inc) ;; 返回结果:{:name "James", :age 27}
内容的提问来源于stack exchange,提问作者CCNA
相关产品推荐
相关产品推荐

