fdef 为函数编写规范
假设我们有以下功能:
(defn nat-num-count [nums] (count (remove neg? nums)))
我们可以通过定义相同名称的函数规范来编写此函数的规范:
(clojure.spec/fdef nat-num-count
:args (s/cat :nums (s/coll-of number?))
:ret integer?
:fn #(<= (:ret %) (-> % :args :nums count)))
:args
采用正则表达式规范,该规范通过对应于参数名称和相应规范的关键字标签来描述参数序列。:args
所需的规范是正则表达式规范的原因是为函数支持多个 arities。:ret
指定函数返回值的规范。
:fn
是一个限制:args
和:ret
之间关系的规范。它在 test.check 中运行时用作属性。它用一个参数调用:一个带有两个键的映射::args
(函数的符合参数)和:ret
(函数的符合返回值)。