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自定义实现的方法来实现这一点。
by
Spec 2确实有模式融合。
by
太棒了!感谢你的回答。
...