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

欢迎!请在关于页面上了解关于如何工作的更多信息。

0
Spec
**问题:**

当尝试验证一个包含可选映射的向量时,如果向量包含有效的映射,规范会正确验证。然而,如果可选映射不满足规范,则会产生误导性的错误消息。如果在可选映射的部分匹配中提供某种指示给用户,将非常有用。

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

以下可选嵌套映射(:optional-nested-map)验证失败,因为:nested-element-b 是字符串而不是整数,然而 explain 报告称规范在父谓词::user/vector-schema 和位置[:] 失败:predicate: 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
by
_评论由: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
by

评论由:jonesn 提出

添加了2016年7月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](https://clojure.atlassian.net/browse/CLJ-1982)(由jonesn报告)
...