Die*_*ngs 5 clojure clojure.spec
我想知道我是如何规定一个函数,它有一个参数,在一个原子中保存一个映射.
(defn do-something [a]
(prn (vals @a)))
Run Code Online (Sandbox Code Playgroud)
这些显然不起作用:
(s/fdef do-something
:args (s/cat :a map?))
Run Code Online (Sandbox Code Playgroud)
我怎么说这a是对地图的引用?
Ale*_*ler 12
别.clojure.spec是关于指定数据的结构,原子是状态,而不是数据.并非每个功能都必须具有(或检查)规范.
我处理有状态数据的一般建议是:
通过一些小心,您通常可以减少将原子取回或返回0的函数数量(通过关闭它所管理的位置的原子),这是一个非常有价值的目标.
你没有.出于一个原因,它不是线程安全的.如果你以某种方式确定原子包含一个地图,它可能会在你检查原子的时候变成一个整数,并继续你的功能.
但是,一种选择是为原子提供验证器.您可以轻松地使用partial来执行此操作:(set-validator! my-atom (partial s/valid? :my-spec)).现在原子将无法更新,除非该值符合:my-spec.
另一种选择是为更新原子的所有函数添加验证逻辑.这两种方法中哪一种最有效取决于应用.
| 归档时间: |
|
| 查看次数: |
916 次 |
| 最近记录: |