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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
Spec
*问题:*

在尝试验证包含可选映射的向量时,如果向量中包含有效的映射,规范将正确验证。然而,如果可选的映射不满足规范,将产生误导性错误消息。如果对可选映射的部分匹配给出某种指示,将很有帮助。

*示例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
by

由:alexmiller发表的评论

您能否更新这个描述,加入一个包含问题的示例?这个例子很复杂,难以复现和理解。

0
by
_由:jonesn_发表的评论

您好,

抱歉我在创建后似乎无法编辑工单的描述。以下是一个简化的示例,希望能够更好地说明情况。

当以下可选嵌套映射由于:nested-element-b不是整型而是字符串而出错时,解释报告说规范在父级谓词失败::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
by

由:jonesn发表的评论

2016-07-19增加了项目存档匹配评论的简化版本。

0
by

由:alexmiller发表的评论

尼克,我已经给了你编辑权限。通常,我们不喜欢外部项目用于复现。如果你能将示例简化到描述中的几行,那将是理想的。

0
by

由:jonesn发表的评论

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

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