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