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

欢迎!有关如何使用本网站的信息,请参阅关于页面。

0
Spec
**问题:**

当尝试验证包含可选映射的向量时,如果向量中包含有效的映射,规范将正确验证。然而,如果可选映射不满足规范,则会生成误导性的错误信息。如果在部分匹配可选映射时,向用户提供一些指示将会更加理想。

**示例 REPL 会话以说明问题:**

以下可选嵌套映射 (:optional-nested-map) 失败验证,因为 :nested-element-b 是字符串而不是整数,但解释报告说规范在父谓词处失败::user/vector-schema at: [: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 是一个字符串而不是整数时,解释性报告会说规范在父谓词处失败::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-07-19添加了项目归档匹配评论的简化版本。

0

评论者:alexmiller

Nick,我已经给您提供了在这里编辑的权限。通常情况下,我们不希望有外部项目用于重现——如果您可以将它简化为描述中的几行示例,那将是理想的。

0

评论者:jonesn

感谢 Alex。我已经更新了描述并删除了项目附件。我还添加了一个 REPL 会话来描述如何在独立的 Clojure 1.9.0-alpha10 REPL 中重现问题。

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