1

我正在尝试使用棱柱模式(1.0.4)强制地图

我试图强迫

{:a 1}

{:b 1}

使用带有模式的自定义匹配器:

{:b s/Int}

但是这段代码不起作用:

(require '[schema.core :as s])
(require '[schema.coerce :as coerce])

((coerce/coercer {:b s/Int}
                 (fn [s]
                   (when (= s s/Keyword)
                     (fn [x]
                       (if (= x :a)
                       :b
                       x))))) 
{:a 1})

输出:

 #schema.utils.ErrorContainer{:error {:b missing-required-key, :a disallowed-key}}

我尝试通过运行以下代码来调试它,该代码匹配架构中的所有内容并输出当前值和匹配的架构:

 ((coerce/coercer {:b s/Int}
             (fn [s]
               (when true
                 (fn [x]
                   (println s x)
                   x)))) 
  {:a 1})

输出:

 {:b Int} {:a 1}
 =>
 #schema.utils.ErrorContainer{:error {:b missing-required-key, :a disallowed-key}}

看起来匹配器一到地图就爆炸了?

4

1 回答 1

3

Schema 首先将您的地图分解为与模式匹配的部分,然后将每个 MapEntry 强制转换为相应的 MapEntry 模式,依此类推。在您的情况下,此故障失败,因此您永远无法找到关键。

为了完成你想要的,你必须将强制附加到地图模式并clojure.set/rename-keys在你的强制函数中使用例如:

(def Foo {:b s/Int})
((coerce/coercer 
   Foo
   (fn [s]
     (when (= s Foo)
       #(clojure.set/rename-keys % {:a :b}))))
 {:a 1})
于 2015-12-12T00:32:05.320 回答