2024 Clojure状态调查!分享您的想法。

欢迎!请参阅关于 页面获取有关此操作更多信息。

0
规格
*问题:*

当尝试验证一个包含可选映射的向量时,如果向量包含有效的映射,规格则会正确验证。然而,如果可选映射不满足规格,则会产生误导性的错误消息。如果对可选映射的局部匹配能给出一些提示给用户会更好。

*用于说明问题的.REPL会话示例:*

以下可选嵌套映射 (:optional-nested-map) 验证失败,因为 :nested-element-b 是字符串而不是整数,然而解释报告说明规格在父谓词 :user/vector-schema 在 [:element-value] 位置失败: string?。

在这种情况下,如果规格报告指出在 :optional-nested-map 处可选嵌套映射由于 ::nested-element-b 在 int? 谓词验证失败而失败,那将更有助于用户。

{code:xml}
user=> (require '[clojure.spec :as s])
nil
user=> (s/def ::nested-element-a string?)
:user/nested-element-a
user=> (s/def ::nested-element-b int?)
:user/nested-element-b
user=> (s/def ::nested-element-schema
          (s/keys :opt-un [::nested-element-a ::nested-element-b]))
:user/nested-element-schema
user=> (s/def ::vector-schema
         (s/cat :tag-kw               #{:tag}
                :optional-nested-map  (s/? (s/spec ::nested-element-schema))
                :element-value        string?))
:user/vector-schema
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b 10} "Element"])
true
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
false
user=> (s/explain ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
In: [1] val: {:nested-element-a "bla", :nested-element-b ""} fails spec: :user/vector-schema at: [:element-value] predicate: string?
nil
user=>

6 个答案

0

评论者:alexmiller

您能更新这个描述,附加一个自包含的示例来说明这个问题吗?这个更大的例子很难复制和理解。

0
_评论者:jonesn_

你好,

很抱歉我没有创建后的门票描述的编辑权限。以下是一个简化的示例,希望有助于更好地说明案例。

当可选嵌套映射因为:nested-element-b是一个字符串而不是int而验证失败时,解释报告说规格在父谓词中失败::user/vector-schema在[:element-value]谓词:string?。

由于它是一个可选映射,我可以理解这种情况。当找不到匹配项时,它会移动到父级中的下一个谓词。

尽管如此,我认为如果有一个部分匹配,将其报告给用户作为规格可能失败的潜在点可能会有所帮助(尤其是在大型可选嵌套数据结构中)。

{code:none}
user=> (require '[clojure.spec :as s])
nil
user=> (s/def ::nested-element-a string?)
:user/nested-element-a
user=> (s/def ::nested-element-b int?)
:user/nested-element-b
user=> (s/def ::nested-element-schema
          (s/keys :opt-un [::nested-element-a ::nested-element-b]))
:user/nested-element-schema
user=> (s/def ::vector-schema
         (s/cat :tag-kw               #{:tag}
                :optional-nested-map  (s/? (s/spec ::nested-element-schema))
                :element-value        string?))
:user/vector-schema
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b 10} "Element"])
true
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
false
user=> (s/explain ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
In: [1] val: {:nested-element-a "bla", :nested-element-b ""} fails spec: :user/vector-schema at: [:element-value] predicate: string?
nil
user=>
 
0

评论者:jonesn

在2016年7月19日添加了项目存档匹配评论的简化版本。

0

评论者:alexmiller

Nick,我已经给你在这里编辑权限。通常,我们不希望使用外部项目进行复制——如果您可以将这些内容简化到描述中几行示例,那就理想了。

0

评论者:jonesn

感谢Alex。我已经更新了描述并移除了项目附件。我还向描述中添加了一个REPL会话,以在独立的Clojure 1.9.0-alpha10 REPL中再现问题。

0
参考: https://clojure.atlassian.net/browse/CLJ-1982 (由 jonesn 报告)
...