Clojure 规范访问分层规范中的数据
Clojure Spec accessing data in hierarchical spec
如果您有一组用于验证分层数据集的规范 - 比如说一个 yaml 文件。从其中一个子规范中,是否可以引用树中较早出现的数据?
这是您可以采用的一种方法的示例:
(s/def ::tag string?)
(s/def ::inner (s/keys :req-un [::tag]))
(s/def ::outer
(s/and
(s/keys :req-un [::inner ::tag])
#(= (:tag %) ;; this tag must equal inner tag
(:tag (:inner %)))))
(s/conform ::outer {:tag "y" ;; inner doesn't match outer
:inner {:tag "x"}})
;=> :clojure.spec.alpha/invalid
(s/conform ::outer {:tag "x"
:inner {:tag "x"}})
;=> {:tag "x", :inner {:tag "x"}}
根据您的要求,您也许可以从外到内而不是从内到外做出这样的断言。
如果您有一组用于验证分层数据集的规范 - 比如说一个 yaml 文件。从其中一个子规范中,是否可以引用树中较早出现的数据?
这是您可以采用的一种方法的示例:
(s/def ::tag string?)
(s/def ::inner (s/keys :req-un [::tag]))
(s/def ::outer
(s/and
(s/keys :req-un [::inner ::tag])
#(= (:tag %) ;; this tag must equal inner tag
(:tag (:inner %)))))
(s/conform ::outer {:tag "y" ;; inner doesn't match outer
:inner {:tag "x"}})
;=> :clojure.spec.alpha/invalid
(s/conform ::outer {:tag "x"
:inner {:tag "x"}})
;=> {:tag "x", :inner {:tag "x"}}
根据您的要求,您也许可以从外到内而不是从内到外做出这样的断言。