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 中被考虑)。在这里想要的,以及对我来说像“合并”这样的操作直观行为,更多的是像并集。如果同一个 `*-un` 键出现在两个规范中,或者如果在输入中出现了名称空间化的 `::a`,流水会遇到麻烦,因为非恒等化形式通常不是幂等的 - 这意味着我无法一定回退到 `and`。据我所知,目前没有实现这一目标的方法,除非拆分映射规范或编写 Spec 的自定义实现。
by
Spec 2 提供了模式并集。
by
太棒了!感谢您的回答。
...