clojure - 是否可以在 Clojure 函数前提条件中使用 Prismatic schema.core/maybe?

标签 clojure preconditions plumatic-schema

我正在尝试使用 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/

相关文章:

c# - 测试先决条件的不同方法的优缺点?

html5-video - 如何修复 412(前提条件失败)错误 HTML5 视频标签

clojure - 为什么使用 onyx 的棱柱模式验证失败(ExceptionInfo 值与模式不匹配)?

java - Java Applets 的 future 是什么样的?

java - 有没有办法在Java中的抽象接口(interface)方法中要求特定值作为参数?

graphql - 使用 Prisma 生成的包装器查询节点时包含关系

clojure - 如何使用 plumatic/schema 生成用户友好的验证消息?

eclipse - 如何在 Eclipse 中打开现有的 Clojure 项目?

clojure - 将函数应用于序列的每个第 n 个元素的巧妙方法?

recursion - 4clojure与本地Clojure不一致