2024年的Clojure调查问卷!中分享您的想法。

欢迎!请访问关于页面以了解如何使用本网站的相关更多信息。

0
Spec
编辑

如果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 修复为关键字,这揭示了规范中的错误,但由于我已经几个月没有碰过代码,我希望我早点发现这个问题 :-) )

1 答案

+1

不,因为现在的“错误”关键字可能后来被添加作为功能的一部分。一般来说,我们在规范的大部分地方都不会进行这样的验证。

by
感谢您的回复。至少有Kondo。
...