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 2具有模式联合。
作者:
太棒了!谢谢你的回答。
...