如何让Clojure.spec生成器始终为规范中的可选键生成数据?
让Clojure Spec生成器始终包含可选键的简便方案
好问题!不用写自定义生成器也能轻松实现这个需求,Clojure Spec本身就提供了现成的合并约束功能,完全满足你的要求。
这里有两种最简便的实现方式:
1. 临时合并约束(不修改原Spec)
如果你只是偶尔需要生成包含::age的::person实例,可以直接在生成时用clojure.spec/merge把原Spec和一个强制要求::age的Spec合并:
(clojure.spec.gen/generate (clojure.spec/gen (clojure.spec/merge ::person (clojure.spec/keys :req [::age]))))
merge操作会合并两个keys类型的Spec约束,把原有的可选键::age提升为必填项,生成器会自动遵循合并后的规则,每次都会生成::age字段。
2. 定义新的复用Spec
如果需要频繁生成带::age的实例,可以把合并后的约束定义成一个新的Spec,方便重复调用:
;; 定义带强制age的person spec (clojure.spec/def ::person-with-age (clojure.spec/merge ::person (clojure.spec/keys :req [::age]))) ;; 直接生成带age的实例 (clojure.spec.gen/generate (clojure.spec/gen ::person-with-age))
这种方式完全依赖Spec内置的功能,不需要编写任何自定义生成器逻辑,既简洁又符合Spec的设计思路。
内容的提问来源于stack exchange,提问作者Punit Naik
相关产品推荐
相关产品推荐

