我们在一个相当大的 Clojure 代码库上工作,我们遇到了这个问题很多次。
声明仅供参考,我们的设计是“一切都是一个映射”,所以这已经困扰了我们很久,如下解决方案可能会有所争议
所以我们有 :keys, :strs 用于解构映射
(def my-func [{:keys [a b c] :as z}])
问题在于,对于调用方来说,很难知道所有函数最终从 z 映射中使用了什么(可以始终使用 get
获取比解构更多东西。更糟糕的是,my-func 将 z 传递到其他地方,这会难以重构代码,而无需遍历 z 所到之处
而是以下内容(命名目前不重要)
(def my-func [{:keys-only [a b c] :as z}])
它仅从映射中提取 a b c,而 z 只包含 a b c 键,这意味着该函数具有关于该函数所需内容的强大合约。无需更多重构挑战