4

我正在尝试在使用可选参数的函数的前提条件中使用Prismaticschema.core/maybe ,但是当我调用函数时opts它似乎总是抛出一个no :AssertionErroropts

(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上用过defn,但那里没有什么不寻常的地方。

我当然可以用一个先决条件来解决这个问题

4

1 回答 1

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))]
于 2014-09-24T16:19:49.363 回答