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

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

0投票
Spec
*问题:*

当尝试验证一个包含可选映射的向量时,如果向量为有效映射,Spec将正确验证。然而,如果可选映射不满足Spec则会产生误导性的错误信息。如果对于部分匹配的可选映射,最好能给出给用户的指示。

*示例REPL会话来演示问题:*

下面的可选嵌套映射(:optional-nested-map)由于:nested-element-b是字符串而不是整数而验证失败,但解释报告说Spec在父级谓词::user/vector-schema在:[:element-value]处失败。string?。

在这种情况下,如果Spec报告可选嵌套映射在: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投票
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 提供

Nick,我已经为您在这里授予编辑权限。通常,我们不喜欢使用外部项目进行重现——如果您能在描述中将示例缩减为几行,那将是理想的。

0投票
by

评论由:jonesn 提供

谢谢 Alex。我已经更新了描述并删除了项目附件。我还将该描述添加了 REPL 会话,以在独立的 Clojure 1.9.0-alpha10 REPL 中重现问题。

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