如何在Clojure的Map中为Vector追加元素且仅引用一次Map与Key?
在Clojure中简洁地为Map内的Vector追加元素
核心解决方案:使用update函数
Clojure内置的update函数刚好能解决重复引用Map和Key的问题——它会自动取出指定Key的当前值,传入后续的处理函数,最终返回更新后的新Map。
针对你最初的示例:
(def my-map {:a-vec []})
只需一行代码就能完成元素追加:
(update my-map :a-vec conj 17)
执行后得到{:a-vec [17]},这里update的逻辑是:取出:a-vec的旧值(空向量),调用(conj 旧值 17),再把结果重新关联到:a-vec上。
修复业务函数中的线程宏风险
你业务代码里直接引用原始objs的写法存在明显问题:线程宏中后续步骤的objs已经是经过前面修改后的新Map,而(col-key objs)取的是初始值,会覆盖之前的修改。用update替换后,就能正确使用线程传递的最新Map:
(defn update-game-objects [objs col-key brick] (-> objs (update col-key conj brick) ; 不再直接引用原始objs,使用线程传递的当前值 (update-in [:temp :x] inc)))
自定义assoc-conj函数(可选)
如果你确实想要类似assoc-conj的语法,可以自己实现一个极简的包装函数:
(defn assoc-conj [m k v] (update m k conj v))
之后就能按你理想的方式调用:
(assoc-conj my-map :a-vec 17)
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

