我们在相当大的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键,这意味着函数有很强的合同约定其需求。不再有重构挑战。