地圖規格

你可以通過指定地圖中應存在哪些鍵來指定地圖:

(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

請注意特殊的 #:閱讀器語法。我們遵循這個名稱空間,我們希望限定所有地圖鍵。然後將根據與提供的名稱空間相對應的規範檢查這些內容。