寻找Clojure中嵌套Map原子更新取值的优雅方案(类Reagent Cursor)
关于clj-cursor是否冗余的解答
痛点匹配度
你现在用的(get-in (swap! nested-map update-in [:a :b] update-fn) [:a :b])确实啰嗦——重复两次路径[:a :b]既没必要,还容易因为路径写错出问题。clj-cursor的设计就是为了解决这种嵌套原子操作的冗余问题,和你喜欢的Reagent cursor逻辑完全一致:一次绑定路径,后续只用swap!就能完成更新+取值,从功能上来说完全命中你的需求,根本谈不上冗余。
要不要用的场景判断
是否引入它,取决于你的使用频率:
- 如果项目里大量需要操作嵌套原子Map的深层路径,clj-cursor是现成的成熟工具,省去了自己封装的成本,代码可读性也更高;
- 如果只是偶尔有这类操作,自己写个轻量的封装函数也够用,比如:
调用时直接用(defn swap-nested! [atom path update-fn & args] (apply swap! atom update-in path update-fn args) (get-in @atom path))(swap-nested! nested-map [:a :b] update-fn),一样能简化代码。
总结
clj-cursor不是冗余工具,它是专门为你这种场景设计的抽象封装。如果你的项目频繁需要这类操作,直接用就行;场景简单的话,自己封装小函数也能达到目的。
内容的提问来源于stack exchange,提问作者alex314159
相关产品推荐
相关产品推荐

