如果s/keys规范中没有有效的参数键(:req
、:req-un
、:opt
、:opt-un
、:gen
),它将静默无操作。
使用req-un
代替:req-un
(符号而不是关键字,可能是一个故意的错误)
user> (s/def ::foo (s/or :string string? :number number?))
:user/foo
user> (s/def ::foo-map-broken (s/keys req-un [::foo]))
:user/foo-map-broken
user> (s/conform ::foo-map-broken {:foo []})
{:foo []}
;;arg key can be anything
user> (s/def ::foo-map-broken2 (s/keys 42 [::foo]))
:user/foo-map-broken2
user> (s/conform ::foo-map-broken2 {:foo []})
{:foo []}
我的看法:我认为对s/keys
的调用应更加严格地验证,因此会输出错误。我唯一能想到的当前行为的好处是,s/keys
的参数实际上是一个字典,在Clojure中通常不将字典视为封闭结构。但1>导致无操作的操作似乎仍然值得报错,2>用户实际上没有传递一个字典,可能没有意识到实现会将他们的参数键和值转换为字典。
(我在clj-kondo标记我的规范为错误时发现了这个行为,我注意到一个像上面的错误,其中我使用的是 req-un
而不是: req-un。我将: req-un 修复为关键字,这揭示了规范中的错误,但由于我已经几个月没有碰过代码,我希望我早点发现这个问题 :-) )