我正在尝试使用 Prismatic schema.core/maybe
在带有可选参数 opts
的函数的前提条件中,但当我调用没有 opts
的函数时,它似乎总是抛出 AssertionError
:
(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
我在 defn
上使用了 macroexpand
,但那里看起来没有什么异常。
我当然可以通过像这样的先决条件来解决这个问题
最佳答案
函数前提条件必须评估为真才能通过断言,但是 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))]
关于clojure - 是否可以在 Clojure 函数前提条件中使用 Prismatic schema.core/maybe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021484/