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”(合并)的操作来说,直觉上应该是合并行为,而不是 mere 联合。如果两个规范中都出现了相同的 `*-un` 键,或者如果在输入中出现了具有名字空间的 `::a`,流行为会遇到麻烦,因为非恒等变形通常不是幂等的,这意味着我无法一定退回到 `and`。据我所知,目前还没有实现这一点的方法,除非将规范映射分开或者编写一个自定义的Spec实现。
by
Spec 2具有模式联合功能。
by
太棒了!感谢您的回答。
...