Ant*_*ald 5 clojure clojure.spec
(require '[clojure.spec :as s])
Run Code Online (Sandbox Code Playgroud)
考虑以下数据:
(def data {:names [["Anna" :lucky]
["Peter"]
["Jon" :lucky]
["Andre" :lucky]]})
Run Code Online (Sandbox Code Playgroud)
它是一个带有一个键的哈希映射:具有向量向量值的名称.内部向量必须包含一个字符串作为第一个元素,并且可以选择包含关键字: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
Run Code Online (Sandbox Code Playgroud)
这有效.但是,如果只有一个选项.解析后的结果不会像这样更好:
`{:name "Tom", :lucky true}` or `{:name "Tom", :lucky false}`
Run Code Online (Sandbox Code Playgroud)
这可以在clojure.spec中完成吗?
有了这个,人们就可以继续:
(s/def ::items (s/coll-of ::item '()))
(s/conform ::items [["Tom" :lucky] ["Tim"]])
[["Tom" :lucky] ["Tim"]]
Run Code Online (Sandbox Code Playgroud)
但是,看起来它通过了测试,但为什么这些项目不再被解析?
编辑: 这可以通过从alpha7切换到alpha10版本来解决,其中coll-of只接受一个参数
最后我的规范看起来像前面所述的警告:
(s/def ::my-spec (s/keys req-un [::items]))
Run Code Online (Sandbox Code Playgroud)
Spec 并不是为了提供任意数据转换而设计的(Clojure 的核心库可以用于此目的)。
可以使用此功能来实现此目的s/conformer,但不建议将该功能用于像这样的任意转换(它更适合构建自定义规范之类的事情)。
| 归档时间: |
|
| 查看次数: |
525 次 |
| 最近记录: |