Clojure 我可以合并需要相同非限定密钥的两个密钥规格吗?

Clojure 我可以合并需要相同非限定密钥的两个密钥规格吗?,clojure,clojure.spec,Clojure,Clojure.spec,在同一名称空间中,我定义了以下规范: (s/def:foo/x字符串?) (s/def:foo/o(s/keys:req un[:foo/x])) (s/valid?:foo/o{:x“true”}) ;=> 真的 (s/def:bar/x布尔值?) (s/def:bar/o(s/keys:req un[:bar/x])) (s/valid?:bar/o{:x true}) ;=> 真的 :foo/o和:bar/o都需要不同的非限定键。(我只是没有把它们包括进来,让事情变得简单。) 现在我想从

在同一名称空间中,我定义了以下规范:

(s/def:foo/x字符串?)
(s/def:foo/o(s/keys:req un[:foo/x]))
(s/valid?:foo/o{:x“true”})
;=> 真的
(s/def:bar/x布尔值?)
(s/def:bar/o(s/keys:req un[:bar/x]))
(s/valid?:bar/o{:x true})
;=> 真的
:foo/o
:bar/o
都需要不同的非限定键。(我只是没有把它们包括进来,让事情变得简单。)

现在我想从
:foo/o
:bar/o
创建
:baz/o
,并选择以下规范:(仍在同一名称空间中)

(s/def:baz/o(s/merge:foo/o:bar/o))
假设在发生键冲突的情况下,
:bar/o
将优先(这是我想要的)。但是,生成的规范拒绝字符串和布尔值:

(s/valid?:baz/o{:x true})
;=> 假的
(s/valid?:baz/o{:x“true”})
;=> 假的
以下是
s/explain
的结果:

(s/explain:baz/o{:x“true”})
; “true”-失败:布尔值?在:[:x]处:[:x]规格::条形图/x
(s/explain:baz/o{:x true})
; true-失败:字符串?在:[:x]处:[:x]规格::foo/x
似乎
s/merge
:x
创建了一个谓词,我无法满足它


如果发生“碰撞”
:应以bar/o
为准。我怎样才能做到这一点?(我使用的是Clojure 1.10)

不确定为什么它不起作用,但最好用s/or定义一个新规范。这样您就可以判断:foo/o或:bar/o是found@JochenBedersdorfer嘿,谢谢你的评论。问题是我不想匹配其中一个。我需要制定一个规范,这是两者的结合。在“规范冲突”的情况下,我很高兴合并的最后一个规范接管。我不确定我是否充分理解用例。如果您有
(s/def:foobar/x(s/or:foo:foo/x:bar:bar/x)
,您可以在
(s/def:baz/o(s/keys:req un[:foobar/x])中使用它
如果您想获得优先权,可能必须使用自己的优先权predicate@JochenBedersdorfer啊,对了,我现在明白你的意思了!事实上这很有趣;我会试试。我仍然有兴趣知道为什么我会看到这种奇怪的行为!:)@JochenBedersdorfer,以防它会更改任何内容。我发布了
s/explain
的结果。我不确定它为什么不起作用,但你最好用s/or定义一个新规范。这样您就可以判断:foo/o或:bar/o是found@JochenBedersdorfer嘿,谢谢你的评论。问题是我不想匹配其中一个。我需要制定一个规范,这是两者的结合。在“规范冲突”的情况下,我很高兴合并的最后一个规范接管。我不确定我是否充分理解用例。如果您有
(s/def:foobar/x(s/or:foo:foo/x:bar:bar/x)
,您可以在
(s/def:baz/o(s/keys:req un[:foobar/x])中使用它
如果您想获得优先权,可能必须使用自己的优先权predicate@JochenBedersdorfer啊,对了,我现在明白你的意思了!事实上这很有趣;我会尝试一下。我仍然有兴趣知道为什么我会看到这种奇怪的行为!:)@JochenBedersdorfer,以防它会改变任何事情。我发布了
s/explain
的结果。