如何在参数中结合映射使用fdef?映射集合验证问题求助
解决Clojure Spec验证映射集合参数的问题
我来帮你搞定这个Spec验证的问题!你遇到的报错本质是参数传递方式和你定义的Spec不匹配,咱们一步步理清楚:
问题根源
你在fdef里给:bar参数用了(spec/+ ...),这个Spec的作用是匹配多个独立的可变参数(也就是调用函数时要传一个或多个单独的映射),但你实际调用(func "hello" t)的时候,是把整个向量t作为单个参数传给:bar的,这就和Spec的预期完全不符,自然验证失败了。
两种解决方案
方案1:调整函数调用方式,适配现有Spec
如果你想保留当前的Spec定义,那需要用apply把向量t里的元素拆成独立参数传递给func:
(apply func "hello" t)
这样func会收到"hello"之后,跟着两个独立的映射参数,刚好满足spec/+要求的“一个或多个符合条件的元素”。
方案2:修改Spec定义,适配现有调用方式
如果想保持(func "hello" t)的调用方式不变,那需要把:bar的Spec改成匹配“包含一个或多个符合要求的映射的序列”,用spec/coll-of替代spec/+,并加上:min-count 1确保至少有一个元素:
(spec/fdef func :args (spec/cat :foo string? :bar (spec/coll-of (spec/keys :req-un [::a ::b] :opt-un [::c ::d]) :min-count 1)))
修改完成后重新执行(stest/instrument),再调用(func "hello" t)就能通过Spec验证了。
内容的提问来源于stack exchange,提问作者dardenfall
相关产品推荐
相关产品推荐

