我们在一个相当大的 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 键,这意味着函数有一个强大的合同,说明了该函数需要什么。不再有重构挑战