微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Clojure.Spec 派生或别名另一个规范

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

例如,我可能有很多字段都需要经过有效的清理降价。

以下示例适用于验证 (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)) 确实有效。

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

解决方法

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

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

您可以在合并地图规范时使用 s/merge,在其他情况下使用 s/and

(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"}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?