Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Clojure.Spec指定映射中的两个键应具有相同的值?_Clojure_Clojurescript_Clojure.spec - Fatal编程技术网

如何使用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
),因为谓词需要相同映射中其他键的知识。