如何使用Clojure.Spec指定映射中的两个键应具有相同的值?
举个简单的例子,我得到了一个包含以下字段的映射如何使用Clojure.Spec指定映射中的两个键应具有相同的值?,clojure,clojurescript,clojure.spec,Clojure,Clojurescript,Clojure.spec,举个简单的例子,我得到了一个包含以下字段的映射 {:name :password :confirm-password} 我已经为这个形状写了以下规格 (s/def ::name string?) ;; password is a string and between 8 - 255 characters (s/def ::password (s/and string? #(<= 8 (count %) 255)) ;; How to write (s/def ::confirm-pa
{:name
:password
:confirm-password}
我已经为这个形状写了以下规格
(s/def ::name string?)
;; password is a string and between 8 - 255 characters
(s/def ::password (s/and string? #(<= 8 (count %) 255))
;; How to write (s/def ::confirm-password)
(s/def ::sign-up-form (s/keys :req-un [::name
::password
::confirm-password])
(s/def::name string?)
;; 密码是一个字符串,长度在8到255个字符之间
(s/def::password(s/和string?#)(您可以使用s/键和另一个谓词检查两个键的值是否相等:
(s/def ::sign-up-form
(s/and
(s/keys :req-un [::name
::password
::confirm-password])
#(= (:password %) (:confirm-password %))))
此匿名函数谓词接收s/keys
spec的整个一致映射输出
(s/explain ::sign-up-form
{:name "Taylor"
:password "weak pass"
:confirm-password "weak pass!"})
;; val: {:name "Taylor", :password "weak pass", :confirm-password "weak pass!"}
;; fails spec: :sandbox.so/sign-up-form predicate:
;; (= (:password %) (:confirm-password %))
是的,这是我最初尝试的,我认为它可能已经足够了。问题是我有点失去了任何路径特异性,问题变成了整个规范本身的问题。我可以通过命名平等规范来改善它,但我仍然丢失了规范/问题的部分中的:path
信息您所针对的问题是映射本身的问题,因为谓词需要映射级别的知识。它不能表示为键级别规范(这将为您提供更具体的:path
),因为谓词需要相同映射中其他键的知识。