繁体   English   中英

Clojure.Spec 派生或别名另一个规范

[英]Clojure.Spec derive or alias another spec

我想使用 clojure 规范来构建一组类型约束,这些约束可以被其他规范别名或进一步约束。

例如,我可能有许多字段都需要有效清理 markdown。

以下示例适用于验证 ( s/valid? ) 但不适用于生成 ( gen/generate )

(s/def ::sanitized-markdown string?)
(s/def ::instruction-list #(s/valid? ::sanitized-markdown %)) ;; works

(gen/generate (s/gen ::instruction-list)) ;; fails

但是(gen/generate (s/gen::sanitized-markdown))确实有效。

有没有办法从::sanitized-markdown扩展::instruction-list以保留所有行为?

您可以通过将另一个规范直接提供给s/def来给另一个规范起别名:

(s/def ::instruction-list ::sanitized-markdown)

在合并 map 规范和s/and时,您可以使用s/merge和其他情况。

(s/def ::sanitized-markdown string?)
(s/def ::instruction-list (s/and ::sanitized-markdown #(> (count %) 10)))

(s/valid? ::instruction-list "abcd")
;; false
(s/valid? ::instruction-list "abcdefghijkl")
;; true

(gen/generate (s/gen ::instruction-list)) 
;; "178wzJW3W3zx2G0GJ1931eEeO"

地图示例

(s/def ::a string?)
(s/def ::b string?)
(s/def ::c string?)
(s/def ::d string?)
(s/def ::first-map (s/keys :opt [::a ::b]))
(s/def ::second-map (s/keys :opt [::c ::d]))
(s/def ::third-map (s/merge ::first-map ::second-map))

(s/valid? ::third-map {:a "1" :d "2"})
;; true
(gen/generate (s/gen ::third-map))
;; {::b "gvQ7DI1kQ9DxG7C4poeWhk553", ::d "9KIp77974TEqs9HCq", ::c "qeSZA8NcYr7UVpJDsA17K"}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM