首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用clojure.spec进行解析

用clojure.spec进行解析
EN

Stack Overflow用户
提问于 2016-08-29 10:53:53
回答 1查看 716关注 0票数 5
代码语言:javascript
复制
(require '[clojure.spec :as s])

考虑以下数据:

代码语言:javascript
复制
(def data {:names [["Anna"      :lucky]
                   ["Peter"]
                   ["Jon"       :lucky]
                   ["Andre"     :lucky]]})

它是一个带有一个键的散列映射:具有向量向量值的名称。内部向量必须包含一个字符串作为第一个元素,并且可以选择地包含关键字:幸运作为第二个元素。

前两句应该用clojure.spec来描述--让我们从向量中的项目开始:

代码语言:javascript
复制
(s/def ::item (s/cat :name string? :lucky (s/? #(= :lucky %))))

(s/conform ::item ["Tom"])
;; {:name "Tom"}
(s/conform ::item ["Tom" :lucky])
;; {:name "Tom", :lucky :lucky}
(s/conform ::item ["Tom" :sad])
;; :clojure.spec/invalid

这个很管用。然而,如果只有一个选择。分析后的结果会不会像这样更好:

代码语言:javascript
复制
`{:name "Tom", :lucky true}` or `{:name "Tom", :lucky false}`

这能在clojure.spec中完成吗?

有了这一点,我们可以继续:

代码语言:javascript
复制
(s/def ::items (s/coll-of ::item '()))

(s/conform ::items [["Tom" :lucky] ["Tim"]])
[["Tom" :lucky] ["Tim"]]

但是,看起来它似乎通过了测试,但是为什么不再解析这些项?

编辑:这个问题可以通过从alpha7切换到alpha10发布来解决,其中coll-of只需要一个参数

最后,我的规范看起来很像,有前面描述过的警告:

代码语言:javascript
复制
(s/def ::my-spec (s/keys req-un [::items]))
EN

回答 1

Stack Overflow用户

发布于 2017-01-16 15:35:42

spec不是为提供任意数据转换而设计的(Clojure的核心库可用于此)。

可以使用s/conformer实现这一点,但不建议将该特性用于这样的任意转换(它更适合构建自定义规范)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39204497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档