【发布时间】:2017-06-13 11:05:14
【问题描述】:
以下 clojure 规范 ::my 允许映射具有键 :width 或键 :height,但不允许同时具有它们:
(s/def ::width int?)
(s/def ::height int?)
(defn one-of-both? [a b]
(or (and a (not b))
(and b (not a))))
(s/def ::my (s/and (s/keys :opt-un [::width ::height])
#(one-of-both? (% :width) (% :height))))
即使它完成了工作:
(s/valid? ::my {})
false
(s/valid? ::my {:width 5})
true
(s/valid? ::my {:height 2})
true
(s/valid? ::my {:width 5 :height 2})
false
代码在我看来并不那么简洁。首先将键定义为可选的,然后根据需要定义。有没有人对此有更易读的解决方案?
【问题讨论】:
-
只是想指出,如果任何一个键持有的值是假的,即
false或nil:(spec/valid? ::my {:width nil})=>false,上述逻辑就会失败。跨度>
标签: clojure clojure.spec