【问题标题】:Clojure Spec : map? failing because spec thinks my data-structure is a vector?Clojure 规范:地图?失败是因为规范认为我的数据结构是向量?
【发布时间】:2018-12-13 14:46:55
【问题描述】:

我正在尝试验证 Spec 中的大型 clojure 数据结构。

我在这部分失败了:

{:pageName "HelloWorld" :pageType ::workPage :cells ["Hello World" "How are you?"]}

使用这个:

(s/def ::WorkPage (s/keys :req-un [::pageName ::pageType ::cells]))

此消息失败(来自说明)

{:pageName "HelloWorld", :pageType :assemblage.db/workPage, :cells ["Hello World" "How are you?"]} db.js:52:1
false db.js:54:1
-- Spec failed --------------------

  [:pageName "HelloWorld"]
  ^^^^^^^^^^^^^^^^^^^^^^^^

should satisfy

  map?

如果我在 repl 中单独运行上述规范,它就可以工作。

但在上下文中(在 clojurescript 文件中),它看起来好像数据结构在经过测试之前在某处被转换为向量。

有没有人见过这样的事情?

这可能是在 ClojureScript 中执行此操作的结果吗?这是一些奇怪的javascript强制泄漏并咬我吗?

或者它可能是完全不同的东西?

【问题讨论】:

  • 可能会遍历映射元素,即[key value] 条目。
  • 什么可能会遍历地图元素?规格?
  • 您是说这是 clojurescript / javascript 问题吗?规范肯定适用于 clojurescript
  • 您能否展示创建该地图的代码以及应用该规范的代码?
  • 请显示您用于获取错误的代码。

标签: clojure clojurescript clojure.spec clojurescript-javascript-interop


【解决方案1】:

我相信这张地图的Spec定义:

{:pageName "HelloWorld" :pageType ::workPage :cells ["Hello World" "How are you?"]}

应该看起来像:

(s/def ::my-map (s/keys :req-un [::pageName ::pageType ::cells]))

可以这样使用:

(s/valid? ::my-map {:pageName "HelloWorld" :pageType ::workPage :cells ["Hello World" "How are you?"]})

在您的帖子中 - 您在地图本身中获得了定义的关键,它可能会导致问题。

规范经常失败(至少在 JS 方面):

should satisfy map?

例如,当您以相同的名称注册更多规范密钥等时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多