2024年Clojure调查问卷 中分享您的想法!

欢迎!请在 关于 页面上了解更多信息。

0
规范

合并带有非规范键的图规范时,只有最后一个规范保留了其规范行为

(s/def ::int-or-string (s/or :int int? :str string?))
(s/def ::a ::int-or-string)
(s/def ::b ::int-or-string)
(s/def ::a-un (s/keys :opt-un [::a]))
(s/def ::b-un (s/keys :opt-un [::b]))
(s/def ::merge-un (s/merge ::a-un ::b-un))
(s/conform ::merge-un {:a 100 :b "foo"})
;;=> {:a 100, :b [:str "foo"]}

与具有规范键的行为进行比较

(s/def ::a-qual (s/keys :opt [::a]))
(s/def ::b-qual (s/keys :opt [::b]))
(s/def ::merge-qual (s/merge ::a-qual ::b-qual))
(s/conform ::merge-qual {::a 100 ::b "foo"})
;;=> #:user{:a [:int 100], :b [:str "foo"]}

1 个答案

0

被选中
 
最佳答案

这是预期行为。s/merge 与 s/and 不一样,它不会“流动”规范。您只能根据合并中的最后一个规范获得规范值。

那么让我们把它视为一个功能请求(我理解可能不会在spec2之前考虑)。我想做的是,对于名为 "merge" 的操作,我觉得直观的行为应该是有序,而不是简单的合并。如果相同的 `*-un` 键出现在两个规范中,或者如果存在命名空间 `::a`,有序合并会遇到麻烦,因为非恒等变形通常不是幂等的,这意味着我无法一定回退到 `and`。据我所知,目前还没有任何方法可以实现这一点,除非拆分映射规范或编写Spec自定义实现。
规范2确实有模式合并功能。
太棒了!感谢你的回答。
...