clojure规范,关键字应为零

clojure规范,关键字应为零,clojure,Clojure,我有一个简单的问题。 给定一个spec def,我想使用相同的spec,但只作为nillable变量 例如 (s/def::uuid uuid?) (s/def::问题规范(s/keys:req un[::uuid])) (s/def::无问题规范(s/keys:req-un[::uuid]) 由于您已将::uuid定义为不可为零,因此无法在映射/键集中对可为零的值使用::uuid键。这是有意的-规范中的限定键是全局定义的 在这种情况下,您可以将::uuid指定为nillable,然后限制密钥集

我有一个简单的问题。
给定一个spec def,我想使用相同的spec,但只作为nillable变量

例如

(s/def::uuid uuid?)
(s/def::问题规范(s/keys:req un[::uuid]))

(s/def::无问题规范(s/keys:req-un[::uuid]) 由于您已将
::uuid
定义为不可为零,因此无法在映射/键集中对可为零的值使用
::uuid
键。这是有意的-规范中的限定键是全局定义的

在这种情况下,您可以将
::uuid
指定为nillable,然后限制密钥集的非nillable版本:

(s/def ::uuid (s/nilable uuid?))

(s/def ::problem-spec (s/and (s/keys :req-un [::uuid])
                             #(some? (:uuid %))))

(s/def ::nilable-problem-spec (s/keys :req-un [::uuid])) ;; as previously
或者,由于您正在处理映射中的非限定键,因此还可以定义两个不同语义的限定
uuid
关键字:

(s/def :nillable/uuid (s/nilable uuid?))
(s/def :non.nil/uuid uuid?)

(s/def ::problem-spec (s/keys :req-un [:non.nil/uuid])))
(s/def ::nilable-problem-spec (s/keys :req-un [:nillable/uuid]))
(s/def :nillable/uuid (s/nilable uuid?))
(s/def :non.nil/uuid uuid?)

(s/def ::problem-spec (s/keys :req-un [:non.nil/uuid])))
(s/def ::nilable-problem-spec (s/keys :req-un [:nillable/uuid]))