您可以通过指定映射中应显示哪些键来指定映射:
(clojure.spec/def ::name string?) (clojure.spec/def ::age pos-int?) (clojure.spec/def ::occupation string?) (clojure.spec/def ::person (clojure.spec/keys :req [::name ::age ::occupation])) (clojure.spec/valid? ::person {::name "john" ::age 25 ::occupation "programmer"}) ;; => true
:req是映射中必须存在的键向量。您可以指定其他选项,例如:opt,可选的键向量。
到目前为止的示例都要求名称中的键是名称空间限定的。但是,映射键通常不合格。对于这种情况,请clojure.spec提供:req和:opt等价于不合格的密钥::req-un和:opt-un。这是带有不合格密钥的相同示例:
(clojure.spec/def ::name string?) (clojure.spec/def ::age pos-int?) (clojure.spec/def ::occupation string?) (clojure.spec/def ::person (clojure.spec/keys :req-un [::name ::age ::occupation])) (clojure.spec/valid? ::person {:name "john" :age 25 :occupation "programmer"}) ;; => true
请注意,:req-un向量中提供的规格仍然合格。clojure.spec会在符合值时自动在映射中确认不合格的版本。
名称空间映射文字语法使您可以通过单个名称空间简洁地限定映射的所有键。例如:
(clojure.spec/def ::name string?) (clojure.spec/def ::age pos-int?) (clojure.spec/def ::occupation string?) (clojure.spec/def ::person (clojure.spec/keys :req [::name ::age ::occupation])) (clojure.spec/valid? ::person #:user{:name "john" :age 25 :occupation "programmer"}) ;;=> true
注意特殊的#:阅读器语法。在此之后,我们希望使用名称空间来限定所有映射键。然后将根据与提供的名称空间相对应的规范来检查这些规范。