我试图在一个带有可选参数opts
的函数的前提条件中使用Prismatic schema.core/maybe
,但是当我调用没有{的函数时它似乎总是抛出一个AssertionError
{1}}:
opts
有趣的是,这可以按预期工作:
(require '[schema.core :as schema])
(defn foo [& modules]
{:pre [(schema/validate (schema/maybe [(schema/enum :foo :bar)]) opts)]}
:yay)
(foo :foo)
;=> :yay
(foo :foo :bar)
;=> :yay
(foo)
;=> AssertionError Assert failed: (schema/validate (schema/maybe [(schema/enum :foo :bar)]) modules) user/foo (form-init3808809389777994177.clj:1)
我在(schema/validate (schema/maybe [(schema/enum :foo :bar)]) nil)
;=> nil
上使用了macroexpand
,但没有什么看起来与众不同。
我当然可以通过
等前提条件解决这个问题答案 0 :(得分:3)
函数前置条件必须评估为传递断言的真实性,但是schema/validate
在验证通过时返回正在测试的表达式,如果失败则抛出异常。如果验证通过,您需要更改前提条件以始终返回true:
(defn foo [& opts]
{:pre [(or (schema/validate (schema/maybe [(schema/enum :foo :bar)]) opts) true)]}
:yay)
(foo :foo) ;=> :yay
(foo :foo :bar) ;=> :yay
(foo) ;=> :yay
(foo :baz) ;=> ExceptionInfo Value does not match schema: [(not (#{:foo :bar} :baz))]