2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面了解更多关于如何使用本网站的信息。

0
Spec
目前,除了测试和无法被动态变量覆盖之外,没有方法可以强制函数{{fdef}}进行验证。在函数中使用强制验证可以有两种方式:使用a) {{:pre}}钩子或b) 手动调用{{s/conform}} / {{s/valid?}},但这不会对函数文档做出贡献。有许多函数总是验证输入的场景,例如在应用启动时配置组件,只执行一次,性能影响不大而正确性很重要。

Schema为此情况提供了{{:always-validate}}元数据


(require '[schema.core :as s])

(s/defn ^:always-validate interceptor-x
  [opts :- {:string? s/Bool}])

(interceptor-x {})
; 编译错误 (ExceptionInfo) 在 (test.cljc:150:1) 时。
; interceptor-x的输入与schema不匹配
;
;       [(:missing-required-key {:string? missing-required-key} opts)]

2 个答案

0

评论由:ikitommi制作

可能类似于:

`
(require '[clojure.spec.alpha :as s])

(defn plus1 [x]
(inc x))

(s/fdef ^:always-validate plus1

    :args (s/cat :x int?))

(plus1 "1")
; 编译错误 (ExceptionInfo) 在 (user.clj:18:1) 时。
; 访问用户/plus1时没有符合spec。
`

0
...