gpt4 book ai didi

clojure - 使用 clojure.spec 解析

转载 作者:行者123 更新时间:2023-12-04 21:08:55 25 4
gpt4 key购买 nike

(require '[clojure.spec :as s])

考虑以下数据:
(def data {:names [["Anna"      :lucky]
["Peter"]
["Jon" :lucky]
["Andre" :lucky]]})

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

前两句应该用 clojure.spec来描述- 让我们从向量中的项目开始:
(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

这有效。但是,如果只有一种选择。解析后的结果不会像这样更好:
`{:name "Tom", :lucky true}` or `{:name "Tom", :lucky false}`

这可以在 clojure.spec 中完成吗?

有了这个,人们可以继续:
(s/def ::items (s/coll-of ::item '()))

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

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

编辑:这可以通过从 alpha7 版本切换到 alpha10 版本来解决,其中 coll-of 只接受一个参数

最后我的规范看起来像,有前面描述的警告:
(s/def ::my-spec (s/keys req-un [::items]))

最佳答案

spec 并非旨在提供任意数据转换(Clojure 的核心库可用于此目的)。

可以使用 s/conformer 来实现这一点。但不建议将该功能用于像这样的任意转换(它更适合构建自定义规范之类的事情)。

关于clojure - 使用 clojure.spec 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39204497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com